Typescript не замечает несовместимости конструктора класса

#typescript

#typescript

Вопрос:

Почему в этом фрагменте TypeScript не замечает, что MadeFromString класс не имеет второго логического аргумента в своем конструкторе и поэтому не подходит для StringConstructable интерфейса:

 interface ComesFromString {
  name: string;
}

class MadeFromString implements ComesFromString {
  constructor(public name: string) {
    // Returns an object of type ComesFromString / MadeFromString
  }
}

interface StringConstructable {
  new (n: string, w: boolean): ComesFromString;
}

function makeObj(n: StringConstructable) {
  return new n('hello!', false);
}

const test1 = makeObj(MadeFromString);
  

Тем не менее, здесь он замечает, что MadeFromString не вызывается логическая переменная w :

 interface ComesFromString {
  name: string;
}

class MadeFromString implements ComesFromString {
  constructor(public name: string) {
    // Returns an object of type ComesFromString / MadeFromString
  }
}

interface StringConstructable {
  new (n: string): ComesFromString;
  w: boolean; // ERROR
}

function makeObj(n: StringConstructable) {
  return new n('hello!', false);
}

const test1 = makeObj(MadeFromString); // ERROR
  

Ответ №1:

Это сделано специально. При проверке совместимости функций typescript обеспечивает передачу всех правильных данных. Он не пытается убедиться, что функция что-то делает с этими данными.

Подумайте, написал ли я следующий конструктор, но ни в одной строке кода не использовался второй аргумент:

 constructor(public name: string, neverUsed: boolean) {
  // the variable neverUsed is not used anywhere in the constructor
}
  

Предположительно, вы согласны с тем, что это должно совпадать StringConstructable . Но переменная ничего не делает. В javascript принято оставлять переменные, которые вас не интересуют; они все равно будут переданы, вы просто не получите к ним доступа. И система типов typescript поддерживает это.

Для получения дополнительной информации см. Эту страницу

Комментарии:

1. Более того, второй пример OP, приведенный в вопросе, подтверждает факт единственного аргумента — вот почему он выдает ошибку.