TypeScript中基于两个泛型接口创建联合类型的正确语法咨询
TypeScript中基于两个泛型接口创建联合类型的正确语法咨询
嗨,我来帮你梳理这个问题的解决思路~你现在遇到的问题核心是泛型接口在联合类型中的正确使用方式,以及接口和类型别名的区别,咱们一步步来拆解:
首先看你原来的代码问题:你写的type ArrayElement = ArrayElementError | ArrayElementSuccess无法编译,是因为ArrayElementSuccess<T>是一个泛型接口,必须指定它的类型参数T,不能直接用未实例化的泛型接口本身来组成联合类型。
下面给你两种常用的正确写法,根据你的需求来选:
1. 定义泛型的联合类型(推荐,类型更安全)
如果你希望这个联合类型能明确指定成功值的类型,把ArrayElement也定义成泛型类型:
interface ArrayElementError { kind: 'failure'; reason: string; } interface ArrayElementSuccess<T> { kind: 'success'; value: T; } // 让联合类型也带上泛型参数T,对应成功接口的value类型 type ArrayElement<T> = ArrayElementError | ArrayElementSuccess<T>;
使用的时候就可以指定具体类型,比如:
// 成功结果:value是number类型 const numSuccess: ArrayElement<number> = { kind: 'success', value: 42 }; // 错误结果:和泛型参数无关,依然可以正常使用 const error: ArrayElement<number> = { kind: 'failure', reason: '数据获取失败' };
2. 定义包含任意成功类型的联合类型
如果你不需要明确限制成功值的类型,想让它兼容任意ArrayElementSuccess实例,可以用unknown(推荐,比any更安全)来填充泛型参数:
type ArrayElement = ArrayElementError | ArrayElementSuccess<unknown>;
这样使用时,成功值可以是任意类型:
const strSuccess: ArrayElement = { kind: 'success', value: 'Hello TypeScript' }; const objSuccess: ArrayElement = { kind: 'success', value: { id: 1, name: 'test' } };
另外还要纠正你提到的另一种写法的误区:interface ArrayElement<T extends ArrayElementError | ArrayElementSuccess> {}是行不通的,因为TypeScript的接口只能继承其他接口/类,不能继承联合类型,而且这里ArrayElementSuccess是泛型,没有指定类型参数也会报错。这种场景下应该用type关键字来定义联合类型,而不是interface。
备注:内容来源于stack exchange,提问作者bznq123
相关产品推荐
相关产品推荐

