@sunny_puppy

Почему typescript ругается на не входящие в интерфейс свойства?

export class HeroesComponent implements OnInit {
  hero: Hero = {
    id: 1,
    name: 'Windstorm',
    extra: 'any'
  };


export default interface Hero {
  id: number;
  name: string;
}


В руководстве typescript дают понять, что главное, чтобы присваиваемое значение имело все свойства, указанные в интерфейсе(типе), но в возникающей ошибке* говорится, что свойство extra быть там не может. В чем дело, может это какие-то более строгие настройки?

* TS2322: Type '{ id: number; name: string; extra: string; }' is not assignable to type 'Hero'. Object literal may only specify known properties, and 'extra' does not exist in type 'Hero'.
  • Вопрос задан
  • 2973 просмотра
Решения вопроса 1
miraage
@miraage
Старый прогер
export default interface Hero {
  id: number;
  name: string;
  extra?: string;
}


Насколько я помню, есть еще такая нотация:
hero: Partial<Hero> = {...};

https://www.typescriptlang.org/docs/handbook/advan...

// EDIT

Неправильно понял вопрос. Кажется, они забыли обновить документацию/примеры...
Я это поведение давно считаю дефолтным, и еще поверх вешаю кучу strict правил TS + TSLint.
https://www.typescriptlang.org/docs/handbook/relea...

Stricter object literal assignment checks
TypeScript 1.6 enforces stricter object literal assignment checks for the purpose of catching excess or misspelled properties. Specifically, when a fresh object literal is assigned to a variable or passed as an argument for a non-empty target type, it is an error for the object literal to specify properties that don’t exist in the target type.


Собственно, если такое Вам не нравится (тогда зачем вообще ts??) - попробуйте те решения, что я предложил.

// EDIT 2

То поведение, которое Вы хотите, называется "утиная типизация". Например, она заложена в "ооп" модель golang.
Насколько мне известно, классические языки со строгой типизацией такое не допускают. И я с ними согласен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы