I TypeScript placeras generiska parametrar före funktionen


Jag har definierat ett gränssnitt A så här:

interface A {
  (): any;
  b: any;
};

Det är dock inte lätt att definiera en variabel som är kompatibel med detta gränssnitt.

Jag har försökt med:

var a: A = function () { console.log('This is a function'); }
a.b = 'This is a field';

Detta utdrag misslyckades på grund av Property 'b' is missing in type '() => void'. Jag tycker att det är rimligt, eftersom det inte finns något b-fält när man definierar a.

Sedan försökte jag med den här:

var a: A = <A> function () { console.log('This is a function'); }
a.b = 'This is a field';

Detta fungerade, men jag har ingen aning om vad den här <A> function ...-syntaksen är.

Det vore fantastiskt om någon kunde hjälpa till. Jag har letat i varje hörn av den officiella dokumentationen.

Tack.

Svar #1

var a: A = <A> function () ...

Här är <A> inte en generic, det är en typkonvertering (du skulle istället kunna skriva as A i slutet). Problemet med ditt ursprungliga uttalande (som saknade typkonverteringen) var att du tilldelade något som inte hade egenskapen b till din variabel a: A (en funktion, i sig, kommer endast att uppfylla din deklaration (): any). Genom att göra en typkonvertering försäkrar du att din funktion har (eller kommer att ha) den egenskapen.

Du skulle alternativt kunna göra b valfritt genom att definiera det som:

b?: any;

I vilket fall skulle du inte behöva typecasten, men jag skulle säga att detta är ett milt missbruk av det valfria, vilket jag tycker passar bättre för optionsobjekt (använda som parametrar).

Observera att det är dålig praxis att tilldela egenskaper till funktioner i TypeScript (vilket är anledningen till att du stöter på svårigheter), även om språket tillåter det (för att göra det möjligt att konvertera gammal js).