TypeScript:当声明=true 时,在通用 Mixin 中使用“this”类型?

问题描述

当我在 index.ts 文件中使用以下代码时,一切正常:

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!

我无法恢复它(虽然 t1t2t4 仍然有效)。

我还尝试再次在 .d.ts 文件中手动将 unkNown 更改为 this['t1'],但这在逻辑上给了我 this 类型的错误仅在课程中可用。

有什么可以做的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)