function typeGuard<T extends { kind: string }>(value: T, kind: string): value is Extract<T, { kind: typeof kind }> {
return value.kind === kind;
}
// 示例用法
type Example = { kind: 'a'; data: string; } | { kind: 'b'; data: number; };
const example1: Example = { kind: 'a', data: 'test' };
const example2: Example = { kind: 'b', data: 123 };
if (typeGuard(example1, 'a')) {
// example1 类型缩小为 { kind: 'a'; data: string; }
console.log(example1.data.toUpperCase());
}
if (typeGuard(example2, 'b')) {
// example2 类型缩小为 { kind: 'b'; data: number; }
console.log(example2.data.toFixed(2));
}
类型推断和约束分析
- 泛型
T
的约束:T
被约束为具有 kind
属性且类型为 string
的类型,这样确保传入的联合类型都有 kind
属性,为类型保护提供依据。
Extract
类型操作符:Extract<T, { kind: typeof kind }>
用于从联合类型 T
中提取出 kind
属性值与传入的 kind
参数匹配的类型,从而实现类型缩小。
- 返回值类型:通过
value is Extract<T, { kind: typeof kind }>
语法,告知 TypeScript 当函数返回 true
时,value
的类型可以缩小为 Extract<T, { kind: typeof kind }>
类型,从而在后续代码中实现智能类型推断。
- 通用性:由于
T
是泛型,并且仅依赖 kind
属性进行类型缩小,所以该函数可以适用于任何具有 kind
属性的联合类型场景,保证了通用性。