Какой способ лучше создать переменную в машинописном тексте - PullRequest
0 голосов
/ 17 июня 2020

У меня есть класс:

export class ICar {
  wheels: number;
  color: string;
  type: string;
}

И когда я хочу создать переменную Какой способ создания будет лучше?

Первый:

const car = {
  wheels: 4,
  color: 'red',
  type: 'truck'
} as ICar;

Или второй:

var car = new ICar(); 
car.wheels = 4; 
car.color = 'red'; 
car.type = 'truck'; 

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Если 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, вы фактически создаете ошибку, которую в противном случае обнаружил бы машинописный текст

Детская площадка с кодом.

0 голосов
/ 17 июня 2020

Если вы попробуете в TypeScript Playground, вы обнаружите, что ваш код даже не компилируется.

Возможно, вы ищете interface вместо class. interface просто определяет, какую форму должен иметь объект, а class вводит contructor(), методы и всевозможные вещи, которые вам, вероятно, не нужны. Вот как бы я написал ваш пример:

// Define an interface specifying what a Car should look like
export interface ICar {
  wheels: number;
  color: string;
  type: string;
}

// Declare a variable implementing the ICar interface, 
// and assign to it a satisfactory object
const car1: ICar = {
  wheels: 4,
  color: 'red',
  type: 'truck'
};
0 голосов
/ 17 июня 2020

Вы должны использовать второй

var car = {}; 
car.wheels = 4; 
car.color = 'red'; 
car.type = 'truck'; 

Первый объект объявлен с помощью const. так что это не может быть изменено позже. так что будет хорошо использовать первый выбор

...