Если ICar
- это класс, тогда первый пример определенно неверен.
Расширяя ваш пример, допустим, у вас есть это:
export class ICar {
wheels: number;
color: string;
type: string;
constructor() {
this.wheels = 2;
this.color = 'blue';
this.type = 'motorcycle'
}
drive() {
console.log('Driving!')
}
}
Правильный способ создать экземпляр класса - использовать ключевое слово new
.
// Good
var car1 = new ICar();
car1.wheels = 4;
car1.color = 'red';
car1.type = 'truck';
car1.drive() // Works
Обратите внимание на последнюю строку. car1.drive()
существует только потому, что был создан экземпляр класса.
Если я сделаю то же самое с приведением типов:
// Very bad
const car2 = {
wheels: 4,
color: 'red',
type: 'truck'
} as ICar;
car2.drive() // ! Runtime error !
Теперь car2.drive()
вызывает ошибку времени выполнения, потому что метод не существует. Это потому, что as ICar
на самом деле ничего не делает в вашем скомпилированном коде. Ключевое слово as
указывает на то, что разработчик знает лучше, чем компилятор машинописного текста, и трактует значение как другой тип, чем в противном случае. Это не фактически преобразует это значение во что-то другое. Таким образом, он не изменяет этот литерал объекта на экземпляр ICar
.
Таким образом, используя здесь as
, вы фактически создаете ошибку, которую в противном случае обнаружил бы машинописный текст
Детская площадка с кодом.