如何在TypeScript中定义泛型参数需实现自身的Mappable接口
解决方案
要约束泛型参数To仅接受实现了Mappable的类型,你可以通过泛型类型约束实现,在To的泛型定义中添加extends Mappable<unknown>限制——unknown是类型安全的占位符,不会像any那样绕过类型检查,完全符合你的要求。
修改后的Mappable接口如下:
interface Mappable<To extends Mappable<unknown>> { map(): To; }
接下来验证你的双向映射场景,完全可以正常工作:
// 定义互相映射的接口,满足约束要求 interface FooMappable extends Mappable<BarMappable> {} interface BarMappable extends Mappable<FooMappable> {} function test() { // 注意:TypeScript中使用const/let声明变量,而非val const x: FooMappable; const y: BarMappable = x.map(); const z: FooMappable = y.map(); // 接口无法直接实例化,需创建具体实现类才能链式调用 class FooImpl implements FooMappable { map(): BarMappable { return new BarImpl(); } } class BarImpl implements BarMappable { map(): FooMappable { return new FooImpl(); } } const w = new FooImpl(); // 链式调用的类型会被正确推导 w.map().map().map().map(); }
关键说明
- 使用
Mappable<unknown>作为约束,确保To必须是Mappable的实现类型,同时避免了any的类型安全问题。 - 原代码中的
val属于非TypeScript语法,需替换为const或let。 - 接口是抽象类型不能直接实例化,链式调用需要依赖具体的实现类。
内容的提问来源于stack exchange,提问作者Fudge Fudge
相关产品推荐
相关产品推荐

