Когда вы пишете:
let obj1: MyClass = { action: "act1" };
Вы используете класс MyClass
в качестве типа , в том смысле, что вы говорите компиляторучто переменная obj1
соответствует типу MyClass
. Он должен иметь все обязательные поля класса и не может иметь никаких неизвестных свойств.
Это хорошо, потому что, если тип будет иметь 200 свойств, intellisense может подсказать, например, о пропущенных свойствах.
Теперь MyClass
на самом деле class
, поэтому он работает не только как тип / интерфейс. Он также обладает некоторыми функциональными возможностями, то есть вы можете вызывать конструктор и использовать extends
при объявлении класса.
Теперь свойства класса по умолчанию не являются свойствами по умолчанию для типа. Если вы попытаетесь добавить инициализатор в машинописный текст interface
или type
, вы увидите ошибку;вместо этого, когда вы добавляете свойство по умолчанию в класс, это означает, что экземпляр будет инициализировать это свойство значением по умолчанию только при вызове из конструктора .
Итак, есть некоторыеЧто вы можете сделать, чтобы решить эту проблему:
- Вы можете продолжать использовать
MyClass
в качестве типа в этом сценарии, но тогда вам все равно нужно объявить опору name
в литерале объекта:
let obj1: MyClass = {action: "act1", name: "first"};
Если вы сделаете это, вы все равно столкнетесь с:
Литерал объекта может указывать только известные свойства
Поскольку свойство action
не существует в MyClass
. Вам необходимо добавить свойство action
к MyClass
.
Использовать конструктор
let obj1 = new MyClass("act1");
Хотя в некоторых сценариях у вас может быть веская причина использовать классы в качестве типов / интерфейсов, вам, вероятно, следует вызывать конструктор классов, когдавозможно - как в этом примере - или, как следует из комментария, использовать для этого интерфейс.
В этом случае, я думаю, вы должны предпочесть вызвать конструктор.
Если вам нужен только тип для получения проверок компилятора / intellisense для типа переменной, вы можете использовать интерфейс:
interface MyCustomType {
name: string;
action?: string;
}
Таким образом, вы получите предупреждение, если попытаетесь ввести переменнуюкак MyCustomType
без имени:
let obj: MyCustomType = {
action: 'act1',
} // error, you need to set 'name' since it is a mandatory field
Вы можете установить объект с действием или без действия, так как это необязательно (из-за '?' в объявлении).
Выневозможно добавить неизвестные поля:
let obj: MyCustomType = {
name: 'name',
value: 1, // error, unknown field
}