哪种方法可以更好地在打字稿中创建变量

Which way to creating variable in typescript better

我有一个 class:

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'; 

你应该使用第二个

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

第一个对象由 const 声明。所以以后不能改了。 所以用第一个就好了

如果您 try it out 在 TypeScript Playground 中,您会发现您的代码甚至无法编译。

您可能正在寻找 interface 而不是 classinterface 简单地定义了一个对象应该有什么样的形状,而 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'
};

如果 ICar 是 class 那么第一个例子肯定是 错误的。

扩展你的例子,假设你有这个:

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

    constructor() {
        this.wheels = 2;
        this.color = 'blue';
        this.type = 'motorcycle'
    }

    drive() {
        console.log('Driving!')
    }
}

创建 class 实例的正确方法是使用 new 关键字。

// Good
var car1 = new ICar(); 
car1.wheels = 4; 
car1.color = 'red'; 
car1.type = 'truck'; 
car1.drive() // Works

注意最后一行。 car1.drive() 仅存在,因为 class 已实例化。

如果我用类型转换做同样的事情:

// Very bad
const car2 = {
    wheels: 4,
    color: 'red',
    type: 'truck'
} as ICar;
car2.drive() // ! Runtime error !

现在 car2.drive() 引发运行时错误,因为该方法不存在。这是因为 as ICar 实际上并没有在您的编译代码中 任何事情。 as 关键字 decalres 开发人员比打字稿编译器更了解,并将值视为与其他类型不同的类型。它确实 而不是 实际上将该值转换为其他值。所以它不会将此对象文字更改为 ICar.

的实例

因此,通过在此处使用 as,您实际上是在创建一个 typescript 否则会捕获的错误

Playground with code.