TypeScript 提供了多种实用程序类型,以促进常见的类型转换。这些实用程序在全局范围内可调用,注意:这些API都有返回值,可以做变量或者直接使用。
构建对象
创建一个Sticker接口,拥有如下属性:
interface Sticker {id: number;name: string;createdAt: string;updatedAt: string;submitter: undefined | string;
}
1.Partial
将一个类型的所有属性转换为可选的,此时会引发Sticker所有属性可能为undefined,这是不应该的,需要使用交叉类型来处理。
type StickerUpdateParam = Partial<Sticker>
// type StickerUpdateParam = {
// id?: number | undefined;
// name?: string | undefined;
// createdAt?: string | undefined;
// updatedAt?: string | undefined;
// submitter?: undefined | string;
// }
2.Required
创建一个类型,将所有 Type 的可选属性转换为必要的。
type AccessiblePageInfo = Required<StickerUpdateParam>;
// type AccessiblePageInfo = {
// id: number;
// name: string;
// createdAt: string;
// updatedAt: string;
// submitter: string;
// }
3.Readonly
将一个类型的所有属性转换为只读的。
type StickerFromAPI = Readonly<Sticker>;
// type StickerFromAPI = {
// readonly id: number;
// readonly name: string;
// readonly createdAt: string;
// readonly updatedAt: string;
// readonly submitter: undefined | string;
// }
4.Record<KeysFrom, Type>
创建一个具有 KeysFrom 列表中所有指定属性的类型,并且将他们值的类型设置为 Type 列出需要哪些 key。
type NavigationPages = 'home' | 'stickers' | 'about' | 'contact';
// 每个数据(上面的key ^)都需要的数据的形状。
interface PageInfo {title: string;url: string;axTitle?: string;
}
const navigationInfo: Record<NavigationPages, PageInfo> = {home: { title: 'Home', url: '/' },about: { title: 'About', url: '/about' },contact: { title: 'Contact', url: '/contact' },stickers: { title: 'Stickers', url: '/stickers/all' }
};
type MyRecord = Record<'a' | 'b', number>;
// type MyRecord = {
// a: number;
// b: number;
// }
5.Pick<Type, Keys>
由 Type 类型选取 Keys 中指定的属性并创建一个新的类型本质上是由某种类型中提取一部分类型信息。
type StickerSortPreview = Pick<Sticker, "name" | "updatedAt">;
// type StickerSortPreview = {
// name: string;
// updatedAt: string;
// }
6.Omit<Type, Keys>
由 Type 类型排除 Keys 中指定的属性并创建一个新的类型,本质上是由某种类型中 排除一部分类型信息。
type StickerTimeMetadata = Omit<Sticker, "name">;
// type StickerTimeMetadata = {
// updatedAt: string;
// id: number;
// createdAt: string;
// submitter: undefined | string;
// }
7.Exclude<Type, RemoveUnion>
创建一个类型,其中 Type 的任何属性都与 RemoveUnion 不重合。
type HomeNavigationPages = Exclude<NavigationPages, "home">;
// type HomeNavigationPages = "stickers" | "about" | "contact"
8.Extract<Type, MatchUnion>
创建一个类型,其中 Type 的任何属性都与 MatchUnion 重合。
type DynamicPages = Extract<NavigationPages, "home" | "stickers">;
// type DynamicPages = "home" | "stickers"
9.NonNullable
从一组类型中将 null 和 undefined 排除后创建一个类型,对有效性检查非常有用。
type StickerLookupResult = Sticker | undefined | null;
type ValidatedResult = NonNullable<StickerLookupResult>;
// type ValidatedResult = Sticker
10.ReturnType
导出一个类型的返回值类型。
declare function getStickerByID(id: number): Promise<ValidatedResult>;
type StickerResponse = ReturnType<typeof getStickerByID>;
// type StickerResponse = Promise<Sticker>
11.InstanceType
创建一个是某个具有构造函数的类或对象的实例的类型。
class StickerCollection {stickers: Sticker[] = [];
}
type CollectionItem = InstanceType<typeof StickerCollection>;
// type CollectionItem = StickerCollection