Типы утилит
TypeScript предоставляет несколько типов утилит для облегчения общих преобразований типов. Эти утилиты доступны глобально.
Awaited<Type>
Выпущено: 4.5
Этот тип предназначен для моделирования операций, таких как await в функциях async, или метод .then() в Promise - в частности, способ рекурсивного раскрытия Promise.
Пример
type A = Awaited<Promise<string>>; type B = Awaited<Promise<Promise<number>>>; type C = Awaited<boolean | Promise<number>>;
Partial<Type>
Выпущено:
2.1
Создаёт тип со всеми свойствами Type, установленных как необязательные. Эта утилита вернёт тип, представляющий все подмножества заданного типа.
Пример
interface Todo {
title: string;
description: string;
}
function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
return { ...todo, ...fieldsToUpdate };
}
const todo1 = {
title: "organize desk",
description: "clear clutter",
};
const todo2 = updateTodo(todo1, {
description: "throw out trash",
}); Required<Type>
Выпущено:
2.8
Создаёт тип, состоящий из всех свойств Type установленных как обязательные. Противоположность Partial.
Пример
interface Props {
a?: number;
b?: string;
}
const obj: Props = { a: 5 };
const obj2: Required<Props> = { a: 5 }; Readonly<Type>
Выпущено:
2.1
Создаёт тип со всеми свойствами Type установленных как readonly, что означает, что свойства созданного типа не могут быть переопределены.
Пример
interface Todo {
title: string;
}
const todo: Readonly<Todo> = {
title: "Delete inactive users",
};
todo.title = "Hello"; Эта утилита полезна для представления выражений присваивания, которые потерпят неудачу во время выполнения (т.е. при попытке переопределения свойств замороженного объекта).
Object.freeze
function freeze<Type>(obj: Type): Readonly<Type>;
Record<Keys, Type>
Выпущено:
2.1
Создаёт тип объекта, ключи свойств которого являются Keys, а значения свойств — Type. Эта утилита может использоваться для отображения свойств одного типа на другой.
Пример
interface CatInfo {
age: number;
breed: string;
}
type CatName = "miffy" | "boris" | "mordred";
const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};
cats.boris; Pick<Type, Keys>
Выпущено:
2.1
Создаёт тип, выбирая набор свойств Keys (строковый литерал или объединение строковых литералов) из Type.
Пример
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Pick<Todo, "title" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
};
todo; Omit<Type, Keys>
Выпущено:
3.5
Создаёт тип, выбирая все свойства из Type и удаляя Keys (строковый литерал или объединение строковых литералов). Противоположность Pick.
Пример
interface Todo {
title: string;
description: string;
completed: boolean;
createdAt: number;
}
type TodoPreview = Omit<Todo, "description">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
createdAt: 1615544252770,
};
todo;
type TodoInfo = Omit<Todo, "completed" | "createdAt">;
const todoInfo: TodoInfo = {
title: "Pick up kids",
description: "Kindergarten closes at 5pm",
};
todoInfo; Exclude<UnionType, ExcludedMembers>
Выпущено:
2.8
Создаёт тип, исключая из UnionType все члены объединения, которые могут быть присвоены ExcludedMembers.
Пример
type T0 = Exclude<"a" | "b" | "c", "a">;
type T1 = Exclude<"a" | "b" | "c", "a" | "b">;
type T2 = Exclude<string | number | (() => void), Function>;
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; x: number }
| { kind: "triangle"; x: number; y: number };
type T3 = Exclude<Shape, { kind: "circle" }> Extract<Type, Union>
Выпущено:
2.8
Создаёт тип, извлекая из Type все члены объединения, которые могут быть присвоены Union.
Пример
type T0 = Extract<"a" | "b" | "c", "a" | "f">;
type T1 = Extract<string | number | (() => void), Function>;
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; x: number }
| { kind: "triangle"; x: number; y: number };
type T2 = Extract<Shape, { kind: "circle" }> NonNullable<Type>
Выпущено:
2.8
Создаёт тип, исключая null и undefined из Type.
Пример
type T0 = NonNullable<string | number | undefined>; type T1 = NonNullable<string[] | null | undefined>;
Parameters<Type>
Выпущено:
3.1
Создаёт кортежный тип из типов, используемых в параметрах типа функции Type.
Пример
declare function f1(arg: { a: number; b: string }): void;
type T0 = Parameters<() => string>;
type T1 = Parameters<(s: string) => void>;
type T2 = Parameters<<T>(arg: T) => T>;
type T3 = Parameters<typeof f1>;
type T4 = Parameters<any>;
type T5 = Parameters<never>;
type T6 = Parameters<string>;
type T7 = Parameters<Function>; ConstructorParameters<Type>
Выпущено:
3.1
Создаёт кортежный или массивный тип из типов функции-конструктора. Он создаёт кортежный тип со всеми типами параметров (или тип never, если Type не является функцией).
Пример
type T0 = ConstructorParameters<ErrorConstructor>;
type T1 = ConstructorParameters<FunctionConstructor>;
type T2 = ConstructorParameters<RegExpConstructor>;
class C {
constructor(a: number, b: string) {}
}
type T3 = ConstructorParameters<typeof C>;
type T4 = ConstructorParameters<any>;
type T5 = ConstructorParameters<Function>; ReturnType<Type>
Выпущено:
2.8
Создаёт тип, состоящий из возвращаемого типа функции Type.
Пример
declare function f1(): { a: number; b: string };
type T0 = ReturnType<() => string>;
type T1 = ReturnType<(s: string) => void>;
type T2 = ReturnType<<T>() => T>;
type T3 = ReturnType<<T extends U, U extends number[]>() => T>;
type T4 = ReturnType<typeof f1>;
type T5 = ReturnType<any>;
type T6 = ReturnType<never>;
type T7 = ReturnType<string>;
type T8 = ReturnType<Function>; InstanceType<Type>
Выпущено:
2.8
Создаёт тип, состоящий из типа экземпляра функции-конструктора в Type.
Пример
class C {
x = 0;
y = 0;
}
type T0 = InstanceType<typeof C>;
type T1 = InstanceType<any>;
type T2 = InstanceType<never>;
type T3 = InstanceType<string>;
type T4 = InstanceType<Function>; ThisParameterType<Type>
Выпущено:
3.3
Извлекает тип параметра this для типа функции, или unknown, если тип функции не имеет параметра this.
Пример
function toHex(this: Number) {
return this.toString(16);
}
function numberToString(n: ThisParameterType<typeof toHex>) {
return toHex.apply(n);
} OmitThisParameter<Type>
Выпущено:
3.3
Удаляет параметр this из Type. Если у Type нет явно объявленного параметра this , результат — просто Type. В противном случае из Type создаётся новый тип функции без параметра this . Обобщения удаляются, и в новый тип функции распространяется только последняя сигнатура перегрузки.
Пример
function toHex(this: Number) {
return this.toString(16);
}
const fiveToHex: OmitThisParameter<typeof toHex> = toHex.bind(5);
console.log(fiveToHex()); ThisType<Type>
Выпущено:
2.3
Эта утилита не возвращает преобразованный тип. Вместо этого она служит маркером для контекстного типа this. Обратите внимание, что флаг noImplicitThis должен быть включён для использования этой утилиты.
Пример
type ObjectDescriptor<D, M> = {
data?: D;
methods?: M & ThisType<D & M>; // Type of 'this' in methods is D & M
};
function makeObject<D, M>(desc: ObjectDescriptor<D, M>): D & M {
let data: object = desc.data || {};
let methods: object = desc.methods || {};
return { ...data, ...methods } as D & M;
}
let obj = makeObject({
data: { x: 0, y: 0 },
methods: {
moveBy(dx: number, dy: number) {
this.x += dx; // Strongly typed this
this.y += dy; // Strongly typed this
},
},
});
obj.x = 10;
obj.y = 20;
obj.moveBy(5, 5); В примере выше, у объекта methods в аргументе makeObject есть контекстный тип, который включает ThisType<D & M>, и поэтому тип this в методах внутри объекта methods равен { x: number, y: number } & { moveBy(dx: number, dy: number): void }. Обратите внимание, как тип свойства methods одновременно является целевым пунктом вывода и источником для типа this в методах.
Маркерный интерфейс ThisType<T> — это просто пустой интерфейс, объявленный в lib.d.ts . Помимо распознавания в контекстном типе объекта-литерала, интерфейс ведет себя как любой пустой интерфейс.
Встроенные типы для работы со строками
Uppercase<StringType>
Lowercase<StringType>
Capitalize<StringType>
Uncapitalize<StringType>
Для помощи в работе со строками в строковых литералах шаблонов TypeScript включает набор типов, которые можно использовать для обработки строк в системе типов. Вы можете найти их в документации по Типам литералов шаблонов.
© 2012-2023 Microsoft
Licensed under the Apache License, Version 2.0.
https://www.typescriptlang.org/docs/handbook/utility-types.html