问题描述
class A<T> {
constructor(public t1: T) {}
}
class B<T> extends A<T> {
t2!: T;
}
function mixinC<TConstructor extends new (...args: any[]) => A<unkNown>>(Base: TConstructor) { // Note "unkNown"
return class extends Base {
t3!: this['t1'];
}
}
export class C<T> extends mixinC(B)<T> {
t4!: T;
}
const c = new C('somestring');
c.t1; // string OK
c.t2; // string OK
c.t3; // string OK !!
c.t4; // string OK
在这里,我使用了 this
类型 (this['t1']
) 技巧来动态告诉 TS (unkNown
) 泛型 T
具有哪种类型。 VS Code 可以正确识别所有类型。
但随后我尝试使用 declaration=true
选项编译代码,这为我提供了以下 .d.ts 文件:
declare class A<T> {
t1: T;
constructor(t1: T);
}
declare class B<T> extends A<T> {
t2: T;
}
declare function mixinC<TConstructor extends new (...args: any[]) => A<unkNown>>(Base: TConstructor): {
new (...args: any[]): {
t3: unkNown;
t1: unkNown;
};
} & TConstructor;
export declare const C_base: {
new (...args: any[]): {
t3: unkNown;
t1: unkNown;
};
} & typeof B;
declare class C<T> extends C_base<T> {
t4: T;
}
declare const c: C<string>;
如您所见,对于 t3
的情况,类型信息丢失了。因此,如果我从另一个 ts 文件(在同一目录中)导入构建的 index.js 并重试
import {C} from './index';
const c = new C('somestring');
c.t3; // unkNown!
我无法恢复它(虽然 t1
、t2
、t4
仍然有效)。
我还尝试再次在 .d.ts 文件中手动将 unkNown
更改为 this['t1']
,但这在逻辑上给了我 this
类型的错误仅在课程中可用。
有什么可以做的吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)