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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:03:30