Как Typescript позволяет вызывать функции с разными типами параметров? - PullRequest
0 голосов
/ 15 мая 2018
"typescript": "2.7.2"

Как / ПОЧЕМУ этот код работал без какой-либо ошибки IDE или ошибки компиляции --aot в проекте Angular 6?

private func1() {
    const b: B = new B();
    b.name = 'jack';
    this.func2(b);
}

private func2(a: A) {
    console.log(a.name); //prints jack
}

-

export class A {
    public name: string;
}

export class B {
    public name: string;
    public surname: string;
}

1 Ответ

0 голосов
/ 15 мая 2018

TypeScript использует систему типов структурный .Это означает, что типы сравниваются по их содержимому .В отличие от большинства других повседневных языков, которые используют номинальные системы типов, в которых типы сравниваются по их имени .Следовательно, в TypeScript ваш тип B может использоваться там, где ожидается тип A, поскольку «форма» типа B точно соответствует «форме», необходимой для типа A - все члены типа A присутствуют в типе B и имеют свои собственные типы.match.

Этот подход был выбран дизайнерами языка TypeScript, потому что он хорошо сочетается с существующими идиомами JavaScript, такими как использование литералов простых объектов, полученных через AJAX, без приведения их в именованный тип.Этот выбор дизайна вызывает некоторые трения в сценариях, когда элементы системы номинального типа были бы удобны (например, типы идентификаторов, такие как ProductId и OrderId должны быть несовместимы).

Соответствующее чтение:

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