如何从接口列表创建泛型?确保函数参数符合指定接口类型
TypeScript泛型约束联合类型参数的实现方法
你已经定义了接口A、B以及它们的联合类型AllTypes:
interface A { // ... } interface B { // ... } type AllTypes = A | B;
要通过泛型确保函数参数是符合A或B的对象,直接给泛型添加extends AllTypes约束即可,这对应你伪代码里的T oneof AllTypes需求:
function test<T extends AllTypes>(argument: T): void { // 函数逻辑 }
说明:
T extends AllTypes表示泛型T必须是AllTypes的子类型,而AllTypes是A和B的联合,所以T只能是A、B,或是它们的扩展子类型(带有额外兼容属性的对象)。- 调用函数时,传入符合A或B的对象会通过编译,不符合的则会触发编译错误:
// 合法:符合A类型 test({ propA: "示例文本" }); // 合法:符合B类型 test({ propB: 123 }); // 编译错误:不属于AllTypes的范围 test({ propC: true });
如果需要严格限制T只能是A或B本身,不允许它们的扩展子类型,可以结合条件类型进一步约束:
function test<T extends AllTypes>(argument: T extends A | B ? T : never): void { // 函数逻辑 }
这种写法会排除掉带有额外属性的A/B子类型,仅接受完全匹配A或B结构的对象。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

