高级类型
交叉类型
交叉类型是将多个类型合并为一个类型,包含了所需的所有类型的特性。
示例
ts
function test<T, U>(a: T, b: U): T & U {
return Object.assign({}, a, b);
}联合类型
- 联合类型表示一个值可以是几种类型中的一个
- 若一个值是联合类型,则只能访问该联合类型所有类型的共有成员
示例
ts
function getSeven(type: "string" | "number"): number | string {
if (type === "string") return "7";
if (type === "number") return 7;
throw new Error("unhandled type: " + type);
}
const seven = getSeven("number");
// console.log(seven - 7) //[ts] 算术运算左侧必须是 "any"、"number" 或枚举类型类型别名
类型别名即对给定的类型起别名,通常用于字面量、元组、联合类型
- 基本格式
type TypeName = Type - 类型别名可以是泛型(TODO:)
- 类型别名中可以引用自身(TODO:)
示例
ts
type Validator = (arg: any) => boolean;字符串字面量类型
固定的字符串也可以作为类型使用,通常与联合类型、类型别名结合使用
示例
ts
type State = "open" | "close";数字字面量类型
固定的数字也可以作为类型使用,一般很少使用
示例
ts
type Top = 1 | 2 | 3;索引类型
索引类型用于检测对象的属性
- 索引类型查询操作符:
keyof T,表示T类型上已知的公共属性名的联合 - 索引访问操作符:
T[K](这里K为T类型上的属性名),用于访问T类型上K属性的类型 keyof T类型被认为是string的子类型
示例
ts
type Key<T> = keyof T;
class P {
label: string;
value: boolean;
}
let label: Key<P> = "label";
let value: P["value"] = false;映射类型
映射类型用于对原类型的属性进行映射和转换以实现新类的类型结构
- 使用
K in T的格式获取T中的属性 - 使用
K in keyof T的格式获取T中的属性
内置的映射类型: Partial, Readonly, Record, Pick
ts
// 用于映射一个接口的子集接口
type Partial<T> = {
[P in keyof T]?: T[P];
};
// FIXME: 新增的
type Required<T> = {
[P in keyof T]-?: T[P];
};
// 用于映射一个接口的只读接口
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
// 用于映射一个接口子集接口,与 Partial 不同的是该映射需要指定属性名
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// 用于映射一个接口中属性的类型转换为另一个类型
type Record<K extends keyof any, T> = {
[P in K]: T;
};