typescript - Restricționează valoarea de returnare a funcției la void
bar este de așteptat să fie o funcție fără valoare de retur:
let foo = () => 'foo';
let bar: () => void = foo; // produces no error
Se poate preveni ca bar să fie atribuit unei funcții care nu corespunde semnăturii așteptate () => void?
De exemplu, în acest caz:
declare let jsApiThatShouldNeverAcceptTypeofFoo = (bar: () => void) => void;
jsApiThatShouldNeverAcceptTypeofFoo(bar);
Răspuns #1
O soluție parțială este să te asiguri că tipul de returnare al funcției nu are chei. Acest lucru este satisfăcut de void, dar și de {} și never. Acest lucru ar putea fi suficient de aproape, deoarece funcțiile care returnează never ar trebui să arunce o eroare, iar funcțiile care returnează {} apar suficient de rar:
type EnsureVoid<T> = keyof T extends never ?
void
: "Should not have a return type, only ()=> void is allowed";
declare let jsApiThatShouldNeverAcceptTypeofFoo: <T extends EnsureVoid<T>>(bar: ()=> T) => void;
let foo = () => 'foo';
jsApiThatShouldNeverAcceptTypeofFoo(foo) // Error
let bar = () => { };
jsApiThatShouldNeverAcceptTypeofFoo(bar)
let baz = () => ({ });
jsApiThatShouldNeverAcceptTypeofFoo(baz)
let boo = () => { throw "Error" };
jsApiThatShouldNeverAcceptTypeofFoo(boo)
Răspunsul #2
Nu, pentru că o funcție care returnează void poate fi atribuită unei funcții care returnează o valoare. Pe de altă parte, nu poți folosi valoarea returnată dacă te așteptai ca funcția să returneze void. adică
let foo = () => 'foo';
let bar: () => void = foo; // produces no error
const result = bar(); // foo in runtime, TypeScript thinks it's void
const upper = result.toUpperCase(); // compile error
