typescript - Validarea tipului de funcție generică
Există o modalitate, în special ca parte a definiției funcției, de a impune o constrângere de tip asupra definiției funcției?
De exemplu:
type IMyFunc<P = any,R = any> = (p: P) => R;
function myFunc<P = any, R = any>(p: P):R { ... }
Cum putem face ca compilatorul TypeScript să verifice că myFunc este o implementare a interfeței IMyFunc?
O modalitate pe care am descoperit-o ar fi să folosesc o declarație separată pentru a valida acest lucru...
const f: IMyFunc = myFunc;
Totuși, în acest caz, parametrii de tip generici impliciți sunt any (așadar nu poți exporta și folosi f decât în cazul implicit). Presupun că este mai bine decât nimic, dar aș prefera ceva mai concis dacă există - de preferință ceva ce pot furniza ca parte a definiției myFunc.
De exemplu, ar fi frumos dacă ai putea să faci asta:
function myFunc<P = any, R = any>(params: P):R {
...
} : IMyFunc<P,R>;
Răspuns #1
În prezent nu există nicio modalitate de a adnota o instrucțiune function astfel încât semnătura apelului acesteia să corespundă unui tip de funcție existent. Există o cerere de funcționalitate deschisă de mult la microsoft/TypeScript#22063 pentru asta. Dacă vrei să vezi acest lucru implementat, nu ar strica să-i dai un 👍. Probabil că nici nu ar ajuta foarte mult, deoarece chiar și cererile de funcționalitate cu multe voturi nu sunt întotdeauna implementate.
Până sau dacă ceva nu se schimbă, atunci va trebui să faci acest tip de verificare într-un mod diferit. Ai putea face ce ai făcut cu const f: IMyFunc=myFunc;, sau chiar să definești const myFunc: IMyFunc=function (p) { ⋯ }.
Răspunsul #2
Există o singură modalitate de a face acest lucru. Dar ar trebui să știi că definiția funcției va fi aceeași și nu o poți face mai scurtă, pentru că trebuie să obții acele tipuri generice oricum.
Pentru a specifica un tip pentru o variabilă care indică o funcție generică, ar trebui să definiți un interface astfel:
interface MyGenericFn {
//You don't need to set `any` as a default value because it's already the default value
<P,R>(p: P): R;
}
function myFunc<P, R>(p: P): R { ... }
const f: MyGenericFn = myFunc;
Poți citi mai detaliat în documentația oficială (https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-types)
