Это связано с характером разрешения типов в машинописи. Когда вы вводите переменную: допустим, что это число (let a: number
), оно может содержать все подтипы number
. Это работает для типов объединения (let a: 1 | 2 | 3
), а также объектов. Таким образом, тип {a: number, b: number}
может быть реализован с любым объектом, если он имеет ключи a и b как (подтипы) number
. Кроме того, обычно нет необходимости предотвращать дальнейшую спецификацию типов, поскольку все функции / классы, работающие с интерфейсом (например, System
), будут иметь все типы системных свойств, как и ожидалось. Они не заботятся об остальном.
Обратите внимание, что есть исключение из этого правила. Когда вам требуется объект в качестве параметра вашей функции, и вы объявляете его встроенным (при вызове функции), машинописный текст выдаст ошибку.
function f(options: {duration: number, easing: string}) {}
f({duration: 200, somethingElse: "hi", easing: "ease"}) // Err
let optionsEnhanced = {duration: 200, somethingElse: "hi", easing: "ease"}
f(optionsEnhanced) // No Err
Поначалу это может показаться запутанным, но на самом деле просто предупреждает вас, что встроенный объявленный параметр имеет свойство, которое никогда не будет использоваться (поскольку на него нет ссылок нигде, кроме как внутри функции) .