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
相关产品推荐
相关产品推荐

