Как предотвратить расширение объекта? - PullRequest
2 голосов
/ 09 апреля 2020

При расширении класса набираются объекты в классе, и я могу добавлять любые свойства, которые мне нужны. Как я могу предотвратить это?

type StaticObject = {
  a: string[];
};

class System {
  staticObject?: StaticObject;
}

export default class ToggleInputSystem extends System {
  staticObject = { // Should be a type error but none appears
    a: ["hi"],
    added: true
  };
}

https://codesandbox.io/s/typescript-playground-export-ed1vx?file= / index.ts: 0-254

1 Ответ

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

Это связано с характером разрешения типов в машинописи. Когда вы вводите переменную: допустим, что это число (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

Поначалу это может показаться запутанным, но на самом деле просто предупреждает вас, что встроенный объявленный параметр имеет свойство, которое никогда не будет использоваться (поскольку на него нет ссылок нигде, кроме как внутри функции) .

...