generics - TypeScript slår ikke opp returtypen for callback i et objekt
TypeScript slutter seg til typen riktig i dette tilfellet, uten at jeg eksplisitt angir en type.
function myFunction<T>(callback: () => T) {
return callback();
}
const result = myFunction(() => 5); //TypeScript knows that "result" type is a Number.
Men det fungerer ikke inne i et objekt, TypeScript tvinger meg til å eksplisitt gi en type.
type MyObject<T> = {
callback: ()=>T
}
const myObject: MyObject = { //Error happens, the compiler ask for a type here.
callback: ()=>5
}
Men kompilatoren bør vite at "callback" er en funksjon som returnerer et tall. Finnes det en måte å fikse dette på?
Svar #1
TypeScript har for øyeblikket ikke konseptet med å utlede typeargumenter i generiske typer på samme måte som når du kaller generiske funksjoner. Det finnes en funksjonsforespørsel på microsoft/TypeScript#26242 som, hvis den implementeres, vil tillate bruk av et symbol for å fortelle kompilatoren å utlede et bestemt typeargument. Så kanskje, en dag i fremtiden, vil du kunne skrive const myObject: MyObject<infer>=... eller const myObject: MyObject<*>=... eller til og med const myObject: MyObject=... og få den oppførselen du ser etter. Men akkurat nå er det ikke en del av språket.
Den eneste måten å få slik oppførsel på nå er å bruke en generell hjelpeidentitetsfunksjon som returnerer sitt inngang:
const asMyObject = <T,>(m: MyObject<T>) => m;
Så i stedet for const myObject: MyObject=... ville du skrevet const myObject=asMyObject(...) og fått samme effekt:
const myObject = asMyObject({
callback: () => 5
});
// const myObject: MyObject<number>
Her har kompilatoren utledet T til å være number i kallet til asMyObject(), og derfor er verdien som returneres fra asMyObject() av typen MyObject<number>, og derfor er også myObject-variabelen det.
Lenke til kode på lekeplassen
