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