Задать вопрос
@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'.
  • Вопрос задан
  • 3321 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • OTUS
    Angular Developer
    5 месяцев
    Далее
  • Учебный центр IBS
    WEB-022 Разработка на Angular. Продвинутый уровень
    1 неделя
    Далее
  • Академия Eduson
    Frontend-разработчик
    9 месяцев
    Далее
Решения вопроса 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.
Насколько мне известно, классические языки со строгой типизацией такое не допускают. И я с ними согласен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы