Tiefgreifendes Verständnis der Verwendung des Schlüsselworts „infer“ in Typescript

Tiefgreifendes Verständnis der Verwendung des Schlüsselworts „infer“ in Typescript

Notieren Sie sich das Schlüsselwort „infer“, um es später nicht zu vergessen. Es ist ein bisschen schwer zu verstehen.

schließen

infer ist ein neues Schlüsselwort, das in TypeScript 2.8 hinzugefügt wurde.

„infer“ kann in der „extended“-Klausel des bedingten Typs verwendet werden, um im realen Zweig auf diese abgeleitete Typvariable zu verweisen und so den abzuleitenden Typ abzuleiten.

Beispiel: Verwenden Sie infer, um den Rückgabewerttyp einer Funktion abzuleiten

Typ ReturnType<T> = T erweitert (...args: beliebig[]) => folgere R? R: beliebig;

Typ fn = () => Zahl
Typ fnReturnType = ReturnType<fn> // Zahl

In diesem Beispiel

Die Form T erweitert U? X: Y ist ein bedingter Typ.

infer R stellt den abzuleitenden Rückgabewerttyp dar. Wenn T eine Funktion (...args: any[]) => infer R ist, gibt es den Rückgabewert R der Funktion zurück, andernfalls gibt es any zurück.

Fallstudie: Vertiefen Sie Ihr Verständnis

Ein Versprechen einlösen

// Versprechen-Antworttyp Typ PromiseResType<T> = T erweitert Promise<infer R> ? R : T

// Asynchrone Funktion strPromise() überprüfen {
  gib „String-Versprechen“ zurück
}

Schnittstelle Person {
  Name: Zeichenfolge;
  Alter: Anzahl;
}
asynchrone Funktion personPromise() {
  zurückkehren {
    Name: "p",
    Alter: 12
  } als Person
}

Typ StrPromise = ReturnType<Typ von strPromise> // Promise<Zeichenfolge>
// Inverser Typ StrPromiseRes = PromiseResType<StrPromise> // str

Typ PersonPromise = ReturnType<Typ von PersonPromise> // Promise<Person>
// Inverser Typ PersonPromiseRes = PromiseResType<PersonPromise> // Person

Eingabetyp der inversen Funktion

Typ Fn<A erweitert beliebig[]> = (...args: A) => beliebig
Typ FnArgs<T> = T erweitert Fn<infer A> ? A : beliebig

Funktion strFn (Name: Zeichenfolge) {

}

Typ StrFn = FnArgs<Typ von strFn> // [Zeichenfolge]

Zu vereinigendes Tupel, zum Beispiel: [Zeichenfolge, Zahl] -> Zeichenfolge | Zahl

Typ ElementOf<T> = T erweitert Array<infer E>? E: nie

Typ TTuple = [Zeichenfolge, Zahl];

Typ ToUnion = ElementOf<ATuple>; // Zeichenfolge | Zahl

neuer Operator

// Parametertyp abrufen Typ ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (...args: infer P) => any ? P : never;

// Instanztyp abrufen Typ InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => R ableiten? R : any;

Klasse TestClass {

  Konstruktor(
    öffentlicher Name: Zeichenfolge,
    öffentliche Zeichenfolge: Nummer
  ) {}
}

Typ Parameter = KonstruktorParameter<Typ der Testklasse>; // [Zeichenfolge, Nummer]

Typ Instanz = Instanztyp<Typ der Testklasse>; // Testklasse

Reagieren - Reduzierer

//Funktion useReducer<R extends Reducer<any, any>, I> definieren(
  Reduzierstück: R,
  // ReducerState abgeleiteter Typ initializerArg: I ​​& ReducerState<R>,
  Initialisierer: (Argument: I & ReducerState<R>) => ReducerState<R>
): [ReducerState<R>, Dispatch<ReducerAction<R>>];

// folgert, Typ ReducerState<R erweitert Reducer<beliebig, beliebig>> = R erweitert Reducer<folgert S, beliebig>
  ? S
  : niemals;
// Reducer-Typ Typ Reducer<S, A> = (prevState: S, action: A) => S;


// Reduzierer verwenden
const Reducer = (x: Zahl) => x + 1;
const [Status, Versand] = useReducer(Reducer, '');
// Argument vom Typ "" kann nicht dem Parameter vom Typ ‚Zahl‘ zugewiesen werden.

vue3 - Referenz

Exportschnittstelle Ref<T = any> {
  [isRefSymbol]: wahr
  Wert: T
}

Exportfunktion ref<T>(Wert: T): T erweitert Ref ? T : Ref<UnwrapRef<T>>

Exporttyp UnwrapRef<T> = {
  cRef : T erweitert ComputedRef<infer V> ? UnwrapRef<V> : T
  ref: T erweitert Ref<infer V> ? UnwrapRef<V> : T
  Array: T
  Objekt: { [K in keyof T]: UnwrapRef<T[K]> }
}[T erweitert ComputedRef<any>
  ? 'cRef'
  : T erweitert Array<beliebig>
    ? 'Reihe'
    : T erweitert Ref | Funktion | Sammlungstypen | Basistypen
      ? 'ref' // Bailout bei Typen, die nicht ausgepackt werden sollten
      : T erweitert Objekt? 'Objekt' : 'Ref']


// Verwenden von const count = ref({
  foo: ref('1'),
  Balken: ref(2)
})

// Abgeleitete konstante Anzahl: Ref<{
  foo: Zeichenfolge;
  Balken: Zahl;
}>

const count = ref(2) // Ref<Zahl>

const count = ref(ref(2)) // Ref<Zahl>

siehe

Das Schlüsselwort „infer“ in TypeScript verstehen

Vue3 Folgen Sie Ihnen, Yuxi, um den TypeScript Ref-Typ von Grund auf zu lernen

Verwenden von TypeScript (V) ---- infer

Damit ist dieser Artikel über das vertiefte Verständnis der Verwendung des Schlüsselworts „infer“ in Typescript abgeschlossen. Weitere verwandte Inhalte zum Schlüsselwort „infer“ in Typescript finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Erläuterung des React+TypeScript-Projektaufbaufalls
  • Tutorial zur TypeScript-Funktionsdefinition und zu Anwendungsfällen
  • Erfahren Sie in einem Artikel mehr über TypeScript-Datentypen
  • Detaillierte Erklärung von as, Fragezeichen und Ausrufezeichen in Typescript
  • Erfahren Sie, wie Sie mit Webpack TypeScript-Code verpacken und kompilieren
  • Warum TypeScripts Enum problematisch ist
  • Ein Tutorial zur Installation, Verwendung und automatischen Kompilierung von TypeScript
  • Fallbeispiel zur TypeScript-Schnittstellendefinition

<<:  Tutorial zur Installation und Konfiguration von Tomcat auf Alibaba Cloud Server und zum Hinzufügen externer Netzwerkzugriffsports

>>:  Eine kurze Diskussion über die Unterschiede zwischen den drei wichtigsten Datenbanken: Mysql, SqlServer und Oracle

Artikel empfehlen

Tutorial zum Deaktivieren und Aktivieren von Triggern in MySQL [Empfohlen]

Bei der Verwendung von MySQL werden häufig Trigge...

Implementierung eines Karussells mit nativem JavaScript

In diesem Artikel finden Sie den spezifischen Cod...

Tutorial zu HTML-Tabellen-Tags (23): Zeilenrahmen-Farbattribut BORDERCOLORDARK

In Zeilen können dunkle Rahmenfarben individuell ...

Tutorial zu HTML-Tabellen-Tags (13): Regeln für interne Rahmenstilattribute

Mit REGELN kann die Art der inneren Rahmen der Ta...

Natives js zum Erzielen eines Akkordeoneffekts

Auch bei der tatsächlichen Entwicklung von Websei...

Erfahrungen bei der Neugestaltung der Homepage von TOM.COM

<br />Ohne Vorwarnung sah ich auf cnBeta Neu...

JS implementiert das Schlangenspiel

Inhaltsverzeichnis 1. Initialisierungsstruktur 2....

Detaillierte Erklärung der Lösung für das Nginx-Panikproblem

In Bezug auf das Nginx-Panikproblem müssen wir zu...

Schritte zum Öffnen des MySQL-Binlogs

Binlog ist eine binäre Protokolldatei, die zum Au...

Ein einfaches Beispiel für die Verwendung von Vue3-Routing VueRouter4

Routenplanung vue-router4 behält den Großteil der...

Implementierung von LNMP für die separate Bereitstellung von Docker-Containern

1. Umweltvorbereitung Die IP-Adresse jedes Contai...