Verwenden Sie das Infer-Schlüsselwort in TypeScript

Migel Hewage Nimesha 15 Februar 2024
  1. Geben Sie Inferenz in TypeScript ein
  2. Verwenden Sie das Schlüsselwort infer in TypeScript
Verwenden Sie das Infer-Schlüsselwort in TypeScript

Dieser Artikel erläutert und demonstriert den Typrückschluss und die Implementierung von bedingten Typen in TypeScript. Hier wird die Bedeutung des Infer-Schlüsselworts und seine Verwendung erläutert.

Geben Sie Inferenz in TypeScript ein

TypeScript ist als typisierte Obermenge der Programmiersprache JavaScript bekannt. Daher können TypeScript-Benutzer die Typen explizit kommentieren, wie im Folgenden gezeigt.

Variablen:

let numberTypeVariable: number = 2;
let stringTypeVariable: string = 'This is a string';
let booleanTypeVariable: boolean = true;

Funktionsparameter:

function addTwoNumbers(numberOne: number, numberTwo: number){
    return numberOne + numberTwo;
}

Funktionsrückgabetypen:

function addTwoNumbers(numberOne: number, numberTwo: number): number{
    return numberOne + numberTwo;
}

Dadurch wird TypeScript zu einer typsicheren Sprache, und Programmierer können Fehler zur Kompilierzeit erkennen. Außerdem müssen Sie Ihre Variablen, Funktionsparameter oder Rückgabetypen nicht explizit annotieren.

Da TypeScript eine typisierte Sprache ist, ist der TypeScript-Compiler intelligent genug, um implizit die richtigen Typen zu finden. Dies wird Typinferenz genannt.

TypeScript verwendet den Best-Common-Type-Algorithmus, um den bestmöglichen Typ auszuwählen, der mit allen Kandidaten kompatibel ist.

Beispiel:

let stringValueInferred = 'This is a string literal';

Ausgabe (in Visual Studio Code):

Typescript Infer - Ausgabe 1

Da die Variable stringValueInferred mit einem String-Literal belegt wurde, leitet der TypeScript-Compiler ihre Typen als String ab.

Wenn Sie den Funktionsparametern Standardwerte zuweisen, leitet der TypeScript-Compiler auch den Typ ab.

Beispiel:

function addTwoNums(numOne=0, numTwo=0){
    return numOne + numTwo
}

Ausgang:

Typescript Infer - Ausgabe 2

Außerdem müssen Sie den Rückgabetyp der Funktion nicht explizit annotieren. Es wurde auch gefolgert.

Typescript Infer - Ausgabe 3

Der Rückgabetyp der Funktion addTwoNums wurde als Typ number abgeleitet. Dies ist eine sehr robuste Funktion, die TypeScript standardmäßig bietet.

Implementieren Sie bedingte Typen in TypeScript

Der bedingte Typ ist ein weiteres leistungsstarkes Merkmal der Typinferenz. TypeScript kann basierend auf einer bestimmten Bedingung einen von zwei möglichen Typen auswählen.

Syntax:

type myPreferredType = T extends U ? X : Y

Die Bedeutung der obigen Syntax ist, dass, wenn ein Typ T einem Typ U zuweisbar ist, der wahre Pfadtyp X gewählt wird; Andernfalls wählen Sie Typ Y.

Lassen Sie uns nun unseren Typ namens myOwnType erstellen.

type myOwnType = number;

Dann erstellen wir einen bedingten Typ namens myOwnConditionalType.

type myOwnConditionalType = myOwnType extends number? number : any;

Ausgang:

Typescript Infer - Ausgabe 4

Der myOwnConditionalType wird als Zahl abgeleitet. Dies liegt daran, dass myOwnType ein Nummerntyp ist und dem Nummerntyp in der angegebenen Bedingung zuweisbar ist: Nummer ? Nummer : beliebig.

Wenn wir den myOwnType in string ändern. Dann sollte der myOwnConditionalType zum Typ any werden.

Ausgang:

Typescript Infer - Ausgabe 5

Dasselbe Konzept gilt auch für komplexe generische Typen. Schauen wir uns einen generischen Typ an.

type myStringOrNullType<T> = T extends string ? string : null;

Wir werden diesen Typ myStringOrNullType<T> verwenden, um einen anderen benutzerdefinierten Typ abzuleiten.

type myInferredType = myStringOrNullType<boolean>;

Ausgang:

Typescript Infer - Ausgabe 6

Der myInferredType wurde als null abgeleitet, weil der boolesche Wert keinem String-Typ zuweisbar ist und die gegebene Bedingung dem falschen Pfad folgt, der null zurückgibt.

Ausgang:

Typescript Infer - Ausgabe 7

Da T jetzt ein String-Literal ist, kann es dem String-Typ zugewiesen werden. Daher wird die Bedingung als wahr ausgewertet, und dieser Pfad gibt den Zeichenfolgentyp zurück.

Verwenden Sie das Schlüsselwort infer in TypeScript

Das Schlüsselwort infer macht die Verwendung von Bedingungstypen flexibler. Es ermöglicht Benutzern, einen Typ als Ganzes oder einen Teil dieses Typs abzuleiten, was in einigen Fällen sehr leistungsfähig ist.

Lassen Sie uns einen neuen Typ mit dem Schlüsselwort infer definieren.

type inferSomeType<T> = T extends infer U ? U : null;

In diesem Fall leiten wir den ganzen T-Typ ab und geben ihn zurück.

type myInferredType = inferSomeType<'This is going to be inferred as the type'>

Ausgang:

Typescript Infer - Ausgabe 8

Jetzt wurde der Typ myInferredType als "This is going to be inferred as the type" abgeleitet, der aus dem Teil infer U stammt. Das heißt, wir haben den ganzen Typ von T gefolgert.

Konzentrieren wir uns nun auf ein weiteres Beispiel, bei dem wir Teile des Typs T ableiten können.

type inferPartsOfSomeType<T> = T extends { propA: infer TypeA, propB: number } ? TypeA : null;

Hier prüfen wir, ob einem gegebenen Objekttyp der Typ T zuordenbar ist. Wenn dieses Objekt mit dem T identisch ist, wird die Bedingung als wahr ausgewertet und gibt den abgeleiteten TypA zurück; andernfalls wird null zurückgegeben.

Lassen Sie uns einen neuen benutzerdefinierten Typ namens inferredType erstellen, indem wir den oben deklarierten Typ inferPartsOfSomeType verwenden.

type inferredType = inferPartsOfSomeType<{ propA: 'NewTypeA' }>

Im obigen Fall ist T dem gegebenen Objekt { prop1: 'NewTypeA' } nicht zuweisbar, da innerhalb dieses Objekts eine andere Zahlentyp-Eigenschaft fehlt. Die Bedingung sollte also als false ausgewertet werden und null als inferredType-Wert zurückgeben.

Ausgang:

Typescript Infer - Ausgabe 9

Geben wir dem definierten Objekt in inferPartsOfSomeType ein identisches Objekt – etwa so.

{ propA: NewTypeA, propB: 500 }

Ausgang:

Typescript Infer - Ausgabe 10

Diesmal ist das neue Objekt { propA: NewTypeA, propB: 500 } dem Typ T zuweisbar; Daher wird die Bedingung als wahr ausgewertet und leitet den Typ von propA ab, der "NewTypeA" ist. Dies fasst zusammen, wie Sie auf Teile des Typs T schließen können.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

Verwandter Artikel - TypeScript Keyword