哪种方法可以更好地在打字稿中创建变量
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
而不是 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'
};
如果 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 否则会捕获的错误
我有一个 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
而不是 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'
};
如果 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 否则会捕获的错误