typescript - Extrahera typ T från SomeType<T>


Jag använde ReturnType<typeof function-name> för att extrahera returtypen - mycket användbart.

Det händer nu att returtypen för funktionen är ett Promise, och jag vill vidare extrahera typparametern, exempel:

const someFunction = (): Promise<MysteryType> => { ... some code ... }

type TheReturnType = ReturnType<typeof someFunction>

type ExtractTypeFromPromise = UNKNOWN<TheReturnType>

Är detta möjligt just nu?

Svar #1

TypeScript-dokumentationen har en sektion som heter "Type inference in conditional types" som ger ett bra svar med Unpacked<T>-typdefinitionen:

type Unpacked<T> =
    T extends (infer U)[] ? U :
    T extends (...args: any[]) => infer U ? U :
    T extends Promise<infer U> ? U :
    T;

Tillsammans med några exempel på resultaten:

type T0 = Unpacked<string>;  // string
type T1 = Unpacked<string[]>;  // string
type T3 = Unpacked<Promise<string>>;  // string

Jag var inte bekant med härledda typer, så tack för att du hjälpte mig att lära mig något nytt! :)

Uppdatering som tar upp ytterligare fråga:

Finns det ett sätt att göra detta där du tvingar typen vid kompileringstid att vara av den instansen.
Exempel: type T0=UnpackedArray<string>/misslyckas eftersom det inte är en Array

Ja! Det är möjligt att sätta begränsningar på den generiska typen med extends:

type UnpackedArray<T extends Array<any>> =
    T extends (infer U)[] ? U : never;

type T2 = UnpackedArray<string[]>; // string
type T3 = UnpackedArray<string>;   // Error: Type 'string' does not satisfy the constraint 'any[]'.