Переопределить объявление метода в унаследованном классе в машинописи - PullRequest
1 голос
/ 20 июня 2019

Допустим, у меня есть этот модуль JavaScript, который я импортировал

class A {
  set (k, v) {
  }
}

И я реализую свой собственный класс на основе этого модуля

import A from 'module'

class B extends A {
  set (k, o) {
    super.set(k, o.v)
    // other stuff...
  }
}

Этот код работает нормально, но я портирую свою часть как машинопись (я новичок в машинописи). К счастью, модуль, который я импортирую, имеет определение типов, что-то вроде

class A<T> {
  set(k: string, v: T): void;
}

И я реализую это так

class T2 {
  v: T1;
}

class B extends A<T1> {
  set(k: string, o: T2): void {
    super.set(k, o.v)
  }
}

Но машинопись, похоже, не нравится. Я продолжаю получать эту ошибку

Type '(k: string, v: T2) => void' is not assignable to type '(k: string, value: T1): void;'

Не уверен, как мутировать аргументы этого метода. Как я могу получить действительный JavaScript из моего сниппета в машинописи?

1 Ответ

1 голос
/ 20 июня 2019

TypeScript указывает, что B на самом деле не может быть заменено для A<T1>, поскольку B#set не совместимо с A#set. Чтобы сделать B заменяющим A<T1>, необходимо разрешить кому-либо звонить set с T1:

class B extends A<T1> {
  set(k: string, o: T1 | T2): void {
    if (o instanceof T2) {
      super.set(k, o.v); // Our new overload
    } else {
      super.set(k, o);  // The contract that A<T1> *must* support.
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...