ES6 и определения типов: динамически назначать тип свойству суперкласса и для intellisense - PullRequest
0 голосов
/ 17 марта 2020

С es6, скажем, у меня есть базовый класс:

export class BaseClass {
  constructor(meta) {
    this.meta = Object.assign({}, { alwaysPresent: 'some value' }, meta);
  }
}

и класс подкласса:

import { BaseClass } from './base-class';
import childMeta from './child-meta';

export class ChildClass extends BaseClass {
  constructor() {
    super(childMeta);
  }

  fn() {
    this.meta.property1;
  }
}

с childMeta:

export default {
  property1: 'property1Value',
  property2: 'property2Value'
};

Как мне создать base-class.d.ts, чтобы, когда я это сделаю, this.meta я мог видеть свойства childMeta?

примерно так:

enter image description here
текущий base-class.d.ts

export class BaseClass {
  protected meta: { property1: string; property2: string }; // for illustration purposes
}

Примечания:

  • childMeta может быть буквально любым js объектом с любым свойством
  • несколько классов будут расширять базовый класс
  • im в основном после intellisense, правда. Для этого я использую vscode.

До сих пор я пробовал читать несколько учебных пособий по динамическим c типам, но я не могу заставить их работать.

мне нужно даже возможно?

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете создать тип на основе childMeta, используя

type ChildMeta = typeof childMeta;

Учитывая это, это зависит от того, что именно вы хотите сделать с этим типом.

  • Если вы хотите определить тип meta в BaseClass, добавьте поле с типом:

    meta: ChildeMeta;
    
  • Если только подкласс должен получить аннотацию типа , вы можете использовать утверждение типа:

    super(childMeta as ChildMeta);
    
...