Почему некоторые части анализа типов машинописи несовместимы? - PullRequest
1 голос
/ 09 апреля 2020
interface X {
    a: number;
}

const x: X = {
    a: 9,
    // somethingElse: 8 // This would result in compilation error as expected
};

const y = {
    a: 9,
    somethingElse: 8
};

const xx: X = y; // but this works

Однако я ожидал бы того же поведения, что и при первом присваивании, что приведет к ошибке компиляции из-за дополнительного свойства.

1 Ответ

1 голос
/ 09 апреля 2020

Обоснование, которое я понимаю, таково:

Сильное ограничение при назначении литерального объекта

При непосредственном определении x: X дополнительное свойство somethingElse должно никогда быть доступным, что, как представляется, является намерением при наборе этого как X.

Все время в остальной части кода x всегда будет иметь тип X, и это не раскрывает somethingElse, поэтому для компилятора здесь код (или разработчик;)) является несовместимым.

Меньше ограничений при назначении из другой переменной

При назначении другой переменной xx with y, y не был явно введен, и, таким образом, свойство somethingElse все еще может использоваться в других местах.

Для компилятора вы, кажется, временно restrict y к той части, которая соответствует интерфейсу X, и это хорошо. В более сложном примере, возможно, многие различные объекты могли бы соответствовать этой роли, поэтому заданный c интерфейс ввода с клавиатуры для xx вполне допустим.

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