Дженерики
в этом разделе я расскажу об одной важной концепции TypeScript: дженерики позволяют передавать типы в качестве параметра другому блоку (функции, классу, интерфейсу и т. д.).
Пример
type MyFunction<TArgs, TReturn> = (args: TArgs) => TReturn;
const numToString: MyFunction<number, string> = num => num.toString(); // '---------> take `number` and return `string`
поэтому тип MyFunction
теперь берет два дженерика для описания типа args и возвращаемого типа.
вы можете пойти дальше и ввести:
type MyFunction<TArgs extends { a: unknown }, TReturn = TArgs['a']> = ( args: TArgs, ) => TReturn;
const numToString: MyFunction<{ a: number }> = obj => obj.a; // '-------> return `number`
это означает, что разработчик должен использовать аргумент со свойством (a)
, а тип возвращаемого значения будет того же типа, что и это свойство (a)
.
еще не интересно?
Тип поиска
это способ машинописного текста заставить его угадывать тип из аргументов без необходимости вводить его самостоятельно.
Пример
const anyToAny = <T>(arg: T) => arg;
// old 🤕 const oldNum = anyToAny<number>(1)
// new 🤩 const num = anyToAny(1) // '-------> type of `number`
// new 🤩 const str = anyToAny('pizza') // '-------> type of `string`
Понимаете…
машинописный текст угадывает тип параметров без необходимости его передачи!!
начать интересоваться? продолжай 😉
Условные типы
Условный тип означает, что вы зависите от условия, чтобы определить тип.
Пример
type IsString<T> = T extends string ? true : false;
type PowerLvl1 = IsString<string> // '------> typeof `true`
type PowerLvl2 = IsString<number> extends true ? 'YES' : 'NO' // '------> typeof `'NO'`
вы видите, что машинописный текст угадывает тип в зависимости от условий!
Все эти примеры в github
Я надеюсь, что вы найдете эти примеры очень полезными, увидимся в следующей части.