在 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
,你可以更容易地处理复杂的类型关系,并确保你的代码具有正确的类型安全性。