TypeScript如何判断泛型是否属于指定联合类型别名
Restrict Generic Parameter to Union Type in TypeScript Function
要实现让getReference方法支持泛型参数,同时让TypeScript自动校验传入的泛型是否属于Reference联合类型,只需要给泛型参数添加类型约束即可,具体步骤如下:
1. 给泛型参数添加约束
在泛型声明<T>后面加上extends Reference,这样TypeScript就会强制要求传入的T必须是Reference联合类型的成员(或者它的子类型)。
2. 调整函数返回类型
把原来返回的Array<Reference>改成Array<T>,让函数的返回值类型匹配传入的泛型参数。
3. 内部返回值的类型断言(必要操作)
因为函数内部实际返回的是Reference[]类型的值,而我们需要返回T[],这里可以用类型断言as T[]——由于已经约束了T extends Reference,这个断言完全安全,TypeScript不会报错。
完整代码示例
export interface A {} export interface B {} export interface C {} export type Reference = A | B | C; // 假设ReferencesSlugs是你定义的类型示例 type ReferencesSlugs = 'onchonch' | 'otherValidSlug'; export const getReference = <T extends Reference>(slug: ReferencesSlugs): (state: object) => Array<T> => { // 模拟内部业务逻辑,返回Reference[]类型的结果 const rawResult: Reference[] = []; // 通过断言把宽泛的Reference[]收窄到具体的T[] return (state: object) => rawResult as T[]; }
有效调用示例
这个调用会通过TypeScript校验,因为A是Reference联合类型的成员:
// 合法,TS校验通过 this.store.pipe( select(getReference<A>('onchonch')) );
无效调用示例
这个调用会触发TypeScript错误,因为E不属于Reference联合类型:
// 非法,TS会报错:类型“E”不满足约束“Reference” this.store.pipe( select(getReference<E>('onchonch')) );
为什么这样可行?
T extends Reference明确告诉TypeScript:T只能是Reference联合类型中的某一个类型(或者它们的子类型),如果传入的类型不在这个范围内,就会抛出类型错误。- 类型断言
as T[]安全可靠,因为我们已经确保了T是Reference的子类型,Reference[]中的每个元素都可以被赋值给T类型,符合TypeScript的类型兼容性规则。
内容的提问来源于stack exchange,提问作者Adrii
相关产品推荐
相关产品推荐

