You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:31:24