typescript - Hur man får en deklarerad funktion att automatiskt härleda typer baserat på användning?
Jag känner att detta borde vara helt möjligt i TypeScript, men det verkar som att TypeScript inte typifierar detta korrekt. Finns det något sätt att göra detta? Här är ett superenkelt exempel, men jag letar specifikt efter att automatiskt härleda argumenttyper när man skickar en funktion till en React-komponents prop som tar en callback med en definierad typ.
Verklig
function constrainingFunction(b: number) {
return b + 1
}
function test(a) { // ERROR: `a` implicitly has an `any` type
constrainingFunction(a)
}
test(1)
Förväntad
function constrainingFunction(b: number) {
return b + 1
}
function test(a) { // `a` should properly be inferred as `number`
constrainingFunction(a)
}
test(1)
Svar #1
Se microsoft/TypeScript#34738 för ett kanoniskt svar.
TypeScript utför inte kontextuell typning av funktionsparametrar från användning på detta sätt, tydligen av prestandaskäl. Enligt denna kommentar från utvecklingsledaren för TS-teamet,
Detta har varit en avsiktlig designbegränsning sedan starten; att inte göra detta är en nyckelorsak till att TS-prestanda är någorlunda acceptabel.
Det finns också den här kommentaren i ett relaterat ärende:
Folk har frågat oss hundratals gånger varför vi inte gör detta; svaret är att det är arkitektoniskt opraktiskt att göra detta på ett sätt som resulterar i stabila, presterande kontrollresultat i annat än leksaksprogram.
Så parametern a måste uttryckligen annoteras som number för att denna kod ska fungera som avsett utan fel.
Men du behöver nödvändigtvis inte vara den som markerar det själv. Som båda kommentarerna ovan fortsätter att säga:
Omstruktureringen "sluta anta typ utifrån användning" kommer att producera en typ åt dig när den begärs.
Refaktorn "slutsatsera från användning" är tillgänglig för detta ändamål.
Så TypeScript kan härleda typen från användning, men inte automatiskt under kompilering. Du kan specifikt begära det i en IDE som stödjer Kodåtgärder som Visual Studio eller TypeScript Playground.
Om du markerar den felaktiga a-parametern bör du se en glödlampa, som när den klickas på, föreslår "härled parametertyper från användning":
function constrainingFunction(b: number) {
return b + 1
}
// 💡 [ infer parameter types from usage ]
function test(a) { // ERROR: `a` implicitly has an `any` type
// -------> ~
constrainingFunction(a)
}
test(1)
Och om du accepterar det förslaget kommer den önskade explicita anteckningen att ske:
function constrainingFunction(b: number) { // <-- magic!
return b + 1
}
function test(a: number) {
constrainingFunction(a)
}
test(1)
Kompletterande animerad skärmdump:
Så det kanske kan vara någon tröst för dig.
Playground-länk till kod
