
在 TypeScript 中,Exclude 是一个高级类型,属于“类型实用工具”(type utilities)。Exclude 类型用于从联合类型中排除某些类型,只留下不在排除列表中的类型。
Exclude 类型的语法如下:
type Exclude<T, U> = T extends U ? never : T;这里,T 是要操作的类型,U 是要排除的类型。如果 T 可以赋值给 U,则结果为 never;否则,结果为 T。
type MyUnionType = string | number | boolean;
type Result = Exclude<MyUnionType, string>; // Result 被推断为 number | boolean在这个例子中,我们从 MyUnionType 联合类型中排除了 string 类型,因此 Result 类型只包含 number 和 boolean。
Exclude**:type MyOtherUnionType = string | number | boolean | null | undefined;
type FinalResult = Exclude<Exclude<MyOtherUnionType, string>, null>; // FinalResult 被推断为 number | boolean | undefined在这个例子中,我们首先排除了 string 类型,然后又排除了 null 类型。
interface User {
id: number;
name: string;
}
type UserKeys = keyof User;
type NonFunctionKey<T> = Exclude<UserKeys, keyof any>; // 排除所有基本数据类型
function printUser(user: User) {
for (const key in user) {
if (typeof user[key as NonFunctionKey<User>] !== "function") {
console.log(`${key}: ${user[key as NonFunctionKey<User>]}`);
}
}
}在这个例子中,我们创建了一个 NonFunctionKey 类型,它排除了所有基本数据类型,这样我们就可以在循环中排除掉对象上的所有函数属性。
Exclude 只能用于联合类型和基本类型之间的操作。如果尝试排除复杂类型(如类类型或接口类型),TypeScript 将报错。Exclude 是一个有条件的类型,这意味着它的结果取决于类型检查的结果。如果 T 可以赋值给 U,则结果为 never;否则,结果为 T。Exclude 是一个非常有用的工具,可以帮助你编写更清晰、更可维护的类型代码。通过使用 Exclude,你可以更容易地处理复杂的类型关系,并确保你的代码具有正确的类型安全性。