type
和 class
有什么区别?
type Point {
x: number, y: number
}
let p = new Point();
以上结果:
'Point' only refers to a type, but is being used as a value here.
为什么会这样?我当然不是使用 Point
作为值,而是使用它来实例化一个类型。
在什么情况下我需要使用 type
因为 class
不合适?
最佳答案
Typescript 有两个不同的宇宙,它们在某些点上有联系:值空间和类型空间。类型空间是定义类型的地方,类型在运行时被完全删除并且不存在。值空间包含值,并且显然会在运行时存在。
什么是值(value)?值文字、变量、常量和参数显然是值。函数和类声明也是值,因为它们确实有一个运行时对象支持它们,即函数对象和类构造函数(也是一个函数)。 枚举也是值,因为它们在运行时由对象备份。
什么是类型?任何带有 type
关键字的定义都是一种类型以及接口(interface)、类声明 和枚举
您会注意到我在两个空格中都提到了类声明。类存在于类型空间和值空间中。这就是为什么我们可以在类型注释(let foo: ClassName
)和表达式(ex new ClassName()
)中使用它们。
枚举也跨越两个世界,它们还代表我们可以在注释中使用的类型,以及将保存枚举的运行时对象。
类型空间和值空间中的名称不会冲突,这就是为什么我们可以定义同名的类型和变量:
type Foo = { type: true }
var Foo = { value : true } // No error, no relation to Foo just have the same name in value space
类声明和枚举,因为它们跨越两个空间,将“用完”两个空间中的名称,因此我们不能定义与类声明或枚举同名的变量或类型(尽管我们可以这样做合并,但这是一个不同的概念)
在您的特定情况下,Point
只是一种类型,我们可以在类型注释中使用它,而不是我们可以在需要运行时存在的表达式中使用的东西。在这种情况下,该类型很有用,因为它允许编译器在结构上检查对象文字是否可分配给 Point
类型:
let p: Point = { x: 10, y: 15 }; // OK
let p: Point = { x: 10, y: 15, z: 10 }; // Error
如果你想创建一个类,你需要使用 class
关键字,因为这将创建一个运行时值,而不仅仅是一个类型:
class Point{
constructor(public x: number, public y: number){}
}
let p = new Point(10,10)
关于typescript - Typescript 中的类型和类有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51131898/