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

Relaterte artikler