TypeScript shartli tiplar
TypeScript-da shartli turlarni tushunish
TypeScript-dagi shartli turlar JavaScript-da if-else operatorlari qanday ishlashiga o‘xshash boshqa turlarga bog‘liq turlarni yaratishga imkon beradi.
Ular murakkab turdagi transformatsiyalar va turdagi darajadagi dasturlash imkonini beruvchi kuchli xususiyatdir.
Asosiy tushunchalar
- Type-level logic : Turlar bo‘yicha shartli tekshiruvlarni o‘tkazing
- Type inference :
inferyordamida turlarni ajratib oling va boshqaring - Composition : Boshqa TypeScript funksiyalari bilan birlashtiring
- Utility types : Kuchli turdagi yordamchi dasturlarni yarating
Umumiy foydalanish holatlari
- Turi-xavfsiz funksiyani haddan tashqari yuklash
- API javob turini o‘zgartirish
- Murakkab turdagi tekshiruvlar
- Qayta foydalanish mumkin bo‘lgan turdagi kommunal xizmatlarni qurish
- Kengaytirilgan turdagi xulosa
Asosiy shartli tur sintaksisi
Shartli turlar T extends U ? X : Y shaklidan foydalanadi, ya’ni:
"agar T turi U turini kengaytirsa (yoki tayinlanishi mumkin bo‘lsa), X turidan foydalaning, aks holda Y turidan foydalaning ".
Misol
type IsString<T> = T extends string ? true : false;
// Usage examples
type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false
type Result3 = IsString<"hello">; // true (literal types extend their base types)
// We can use this with variables too
let a: IsString<string>; // a has type 'true'
let b: IsString<number>; // b has type 'false'
O‘zingiz sinab ko‘ring »
Birlashmalar bilan shartli turlar
Tarqatuvchi shartli turlar
Shartli turlar kasaba uyushmalari turlari uchun ayniqsa foydali bo‘lib, ular kasaba uyushma a’zolariga avtomatik ravishda taqsimlanadi:
Misol
type ToArray<T> = T extends any ? T[] : never;
// When used with a union type, it applies to each member of the union
type StringOrNumberArray = ToArray<string | number>;
// This becomes ToArray<string> | ToArray<number>
// Which becomes string[] | number[]
// We can also extract specific types from a union
type ExtractString<T> = T extends string ? T : never;
type StringsOnly = ExtractString<string | number | boolean | "hello">;
// Result: string | "hello"
O‘zingiz sinab ko‘ring »
infer bilan xulosa yozing
Murakkab tuzilmalardan turlarni ajratib olish
infer kalit so‘zi shartli turning shart qismidagi turdagi o‘zgaruvchini e’lon qilish va undan keyin shartning haqiqiy bo‘limida foydalanish imkonini beradi:
Misol
// Extract the return type of a function type
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
// Examples
function greet() { return "Hello, world!"; }
function getNumber() { return 42; }
type GreetReturnType = ReturnType<typeof greet>; // string
type NumberReturnType = ReturnType<typeof getNumber>; // number
// Extract element type from array
type ElementType<T> = T extends (infer U)[] ? U : never;
type NumberArrayElement = ElementType<number[]>; // number
type StringArrayElement = ElementType<string[]>; // string
O‘zingiz sinab ko‘ring »
O‘rnatilgan shartli turlar
Standart kutubxona yordamchi dasturlari
TypeScript o‘zining standart kutubxonasida bir nechta o‘rnatilgan shartli turlarni o‘z ichiga oladi:
Misol
// Extract<T, U> - Extracts types from T that are assignable to U
type OnlyStrings = Extract<string | number | boolean, string>; // string
// Exclude<T, U> - Excludes types from T that are assignable to U
type NoStrings = Exclude<string | number | boolean, string>; // number | boolean
// NonNullable<T> - Removes null and undefined from T
type NotNull = NonNullable<string | null | undefined>; // string
// Parameters<T> - Extracts parameter types from a function type
type Params = Parameters<(a: string, b: number) => void>; // [string, number]
// ReturnType<T> - Extracts the return type from a function type
type Return = ReturnType<() => string>; // string
O‘zingiz sinab ko‘ring »
Ilg‘or naqshlar va texnikalar
Rekursiv shartli turlar
Murakkab turdagi transformatsiyalarni yaratish uchun shartli turlardan rekursiv foydalanish mumkin:
Misol
// Deeply unwrap Promise types
type UnwrapPromise<T> = T extends Promise<infer U> ? UnwrapPromise<U> : T;
// Examples
type A = UnwrapPromise<Promise<string>>; // string
type B = UnwrapPromise<Promise<Promise<number>>>; // number
type C = UnwrapPromise<boolean>; // boolean
O‘zingiz sinab ko‘ring »
Turi darajasidagi If-Else zanjirlari
Murakkab turdagi mantiq uchun bir nechta shartlarni birlashtiring:
Misol
type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
// Usage
type T0 = TypeName<string>; // "string"
type T1 = TypeName<42>; // "number"
type T2 = TypeName<true>; // "boolean"
type T3 = TypeName<() => void>; // "function"
type T4 = TypeName<Date[]>; // "object"
O‘zingiz sinab ko‘ring »
Shartli turlar umumiy yordamchi dasturlar va turdagi xavfsiz kutubxonalarni yaratishda kuchli hisoblanadi:
Misol
// A function that returns different types based on input type
function processValue<T>(value: T): T extends string
? string
: T extends number
? number
: T extends boolean
? boolean
: never {
if (typeof value === "string") {
return value.toUpperCase() as any; // Type assertion needed due to limitations
} else if (typeof value === "number") {
return (value * 2) as any;
} else if (typeof value === "boolean") {
return (!value) as any;
} else {
throw new Error("Unsupported type");
}
}
// Usage
const stringResult = processValue("hello"); // Returns "HELLO" (type is string)
const numberResult = processValue(10); // Returns 20 (type is number)
const boolResult = processValue(true); // Returns false (type is boolean)
O‘zingiz sinab ko‘ring »
Eng yaxshi amaliyotlar
Qilish:
- Murakkab turdagi transformatsiyalar uchun shartli turlardan foydalaning
- Turni ajratib olish uchun
inferbilan birlashtiring - Qayta foydalanish mumkin bo‘lgan turdagi yordamchi dasturlarni yarating
- Hujjat kompleksining shartli turlari
- Turingizdagi ta’riflardagi chekka holatlarni sinab ko‘ring
Qilmang:
- Oddiy turlar yetarli bo‘lganda murakkab shartli turlardan ortiqcha foydalaning
- Tushunish qiyin bo‘lgan chuqur joylashtirilgan shartli turlarni yarating
- Juda murakkab turlar bilan ishlash oqibatlarini unuting
- Ish vaqti mantig‘i uchun shartli turlardan foydalaning
Ishlash bo‘yicha mulohazalar
- Chuqur joylashtirilgan shartli turlar kompilyatsiya vaqtini oshirishi mumkin
- Oraliq natijalar uchun turdagi taxalluslardan foydalanishni ko‘rib chiqing
- TypeScript-ning rekursiya chuqurligi chegaralarini yodda tuting
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
