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

TypeScript如何保留私有字段类型以维持UnwrapFoo工具类型的功能?

解决TypeScript私有属性类型在.d.ts中被擦除导致泛型推断失效的问题

方案1:用declare定义纯类型私有属性

这是最贴合需求的方案——通过declare关键字标记私有属性仅存在于类型系统,编译时会被完全移除,同时生成.d.ts时保留类型注解:

class Foo<T> {
    private declare _dummy: T;
}

type UnwrapFoo<T extends Foo<any>> = T extends Foo<infer Unwrapped> ? Unwrapped : never;

生成的.d.ts会正确保留类型:

class Foo<T> {
    private _dummy: T;
}

这样UnwrapFoo就能正常推断泛型,且运行时不会有多余属性,也不需要用!断言赋值。

方案2:构造函数参数绑定泛型(支持实例化)

如果需要实例化Foo,可以通过私有构造函数参数绑定泛型,搭配declare避免运行时生成属性:

class Foo<T> {
    private declare constructor(private _dummy?: T);

    // 提供静态方法创建实例
    static create<T>(): Foo<T> {
        return {} as Foo<T>;
    }
}

type UnwrapFoo<T extends Foo<any>> = T extends Foo<infer Unwrapped> ? Unwrapped : never;

这种方式既绑定了泛型类型,又不会在运行时产生多余属性,同时.d.ts会保留泛型关联。

方案3:抽象类作为类型载体(无需实例化)

如果不需要实例化Foo,仅用它做类型标记,可改用抽象类:

abstract class Foo<T> {
    private _dummy!: T;
}

type UnwrapFoo<T extends Foo<any>> = T extends Foo<infer Unwrapped> ? Unwrapped : never;

抽象类无法被实例化,且生成的.d.ts会保留_dummy的类型注解,确保泛型不会被丢弃。

内容的提问来源于stack exchange,提问作者Lehks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:45:10