Τα μοτίβα generics που χρησιμοποιείς συχνά, ομαδοποιημένα ανά εργασία: δήλωσε μια παράμετρο τύπου, περιόρισέ την, δώσε της προεπιλογή, διακλαδίσου με υπό συνθήκη τύπο, συνέλεξε με infer και χαρτογράφησε ένα σχήμα. Κάθε γραμμή ζευγαρώνει το μοτίβο με παράδειγμα μίας γραμμής.
Ένα generic είναι παράμετρος τύπου: ένα σύμβολο θέσης για έναν τύπο που διαλέγει ο καλών, ώστε μία συνάρτηση ή ένας τύπος να εξυπηρετεί πολλά σχήματα χωρίς να χάνει ακρίβεια. Διάβασε το <T> ως «για κάποιον τύπο T». Η δύναμη προέρχεται από τον περιορισμό του T, τη διακλάδωση πάνω του και τη χαρτογράφησή του. Τα μοτίβα παρακάτω είναι το καθημερινό λεξιλόγιο.
Πίνακας αναφοράς · 28 καταχωρήσεις
Generics TypeScriptExplained
28 of 28 rows
Δήλωση
Μια παράμετρος τύπου που διαλέγει ο καλών.
function first<T>(xs: T[]): T
Αρκετές ανεξάρτητες παράμετροι τύπου.
function pair<T, U>(a: T, b: U): [T, U]
Μια δεύτερη παράμετρος δεμένη με τα κλειδιά της πρώτης.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Μια κλάση με παράμετρο τύπου στα πεδία και τις μεθόδους της.
class Box<T> { value: T }
Ένα σχήμα αντικειμένου με παράμετρο τύπου.
interface Result<T> { data: T }
Παράμετρος τύπου σε arrow συνάρτηση· το κόμμα στο τέλος εμποδίζει τα αρχεία .tsx να τη διαβάσουν ως JSX.
const first = <T,>(xs: T[]): T => xs[0]
Περιορισμός
Απαιτεί το T να είναι εκχωρήσιμο στο Type.
function len<T extends { length: number }>(x: T)
Περιορίζει το T σε ένα κλειδί άλλου τύπου.
type Keys<O> = keyof O
Περιορίζει το T σε μια κλάση που κατασκευάζεται με new.
function make<C extends new () => C>(c: C): C
Απαιτεί το T να ικανοποιεί αρκετούς περιορισμούς ταυτόχρονα.
function log<T extends Error & { code: number }>(e: T)
Περιορίζει σε οτιδήποτε· κρατά την παράμετρο γενική χωρίς να τη στενεύει.
type Wrap<T> = T extends unknown ? { v: T } : never
Προεπιλογή & infer
Δίνει στο T προεπιλογή όταν ο καλών την παραλείψει.
function parse<T = string>(): T
Συλλαμβάνει έναν τύπο μέσα σε υπό συνθήκη τύπο.
type El<T> = T extends Array<infer I> ? I : never
Αναδίπλώνει ένα εμφωλευμένο Promise στον εσωτερικό του τύπο.
type Data = Awaited<Promise<User>>
Συλλαμβάνει ένα κομμάτι ενός τύπου template literal.
type Path<S> = S extends `/api/${infer R}` ? R : never
Ελέγχει ολόκληρη την ένωση μονομιάς· ένα γυμνό T κάνει infer ένα μέλος τη φορά.
type El<T> = [T] extends [Array<infer I>] ? I : never
Υπό συνθήκη και χαρτογραφημένοι τύποι
Επιλέγει τύπο ανάλογα με το αν το T εκχωρείται στο U.
type IsStr<T> = T extends string ? true : false
Χτίζει νέο τύπο αντικειμένου μετασχηματίζοντας κάθε κλειδί του T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Ένα αντικείμενο με κλειδιά K και τιμές V.
type Scores = Record<string, number>
Ενσωματωμένα generics παράγωγα των παραπάνω μοτίβων.
type Preview = Pick<User, "id" | "name">
Ένα γυμνό T πριν το extends τρέχει μία φορά ανά μέλος της ένωσης και ενώνει τα αποτελέσματα.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Προσθέτει ή αφαιρεί τροποποιητές από χαρτογραφημένα κλειδιά.
type Req<T> = { [K in keyof T]-?: T[K] }
Τα κλειδιά μιας τιμής χρόνου εκτέλεσης, ως τύπος.
const opts = { a: 1 }; type K = keyof typeof opts
Χτίζει έναν τύπο string από άλλους τύπους string.
type Route = `/users/${string}`
Ενώνει τύπους tuple από άκρο σε άκρο.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Ένας τύπος του οποίου ο ορισμός παραπέμπει στον εαυτό του.
type Json = string | number | Json[] | { [k: string]: Json }
Ελέγχει μια τιμή έναντι ενός τύπου και κρατά τον στενότερο literal τύπο της.
const c = { dark: "#000" } satisfies Record<string, string>
Κρατά τον literal τύπο που πέρασε ο καλών αντί να τον διευρύνει (TS 5.0).