如何基于泛型参数限制TypeScript接口类型?
TypeScript 接口条件类型实现方案
需求场景
原接口定义如下:
interface Foo<T> { data: T[] | SomeWrapper<T> }
需要修改该接口,使得仅当泛型T为string类型时,data字段允许是数组类型;当T为其他类型时,data只能是SomeWrapper<T>类型。
实现方案
可以利用TypeScript的条件类型结合never类型来实现这个限制,具体代码如下:
写法一
interface Foo<T> { data: T extends string ? T[] | SomeWrapper<T> : SomeWrapper<T> }
写法二(更直观的类型排除)
interface Foo<T> { data: (T extends string ? T[] : never) | SomeWrapper<T> }
原理说明
- 当
T等于string时,条件类型分支返回string[] | SomeWrapper<string>,满足数组和包装类型都允许的需求; - 当
T为其他类型(如number、boolean等)时,条件类型分支会返回never,而never类型会被TypeScript自动忽略,最终data字段仅保留SomeWrapper<T>类型,达到了非string类型禁用数组的效果。
内容的提问来源于stack exchange,提问作者Rollie
相关产品推荐
相关产品推荐

