typescript - Typescript 中的类型和类有什么区别?

标签 typescript

typeclass 有什么区别?

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/

相关文章:

c# - 如何通过 TFS 构建过程为 Jasmine\Karma 运行 Typescript 测试

javascript - 删除数组中的奇数

typescript - 需要澄清整洁的架构和存储库模式

postgresql - 如何使用 TypeORM 设置与自定义 ID 名称的多对多关系

angular - 将模板向下传递到压缩网格列

Angular - 如何在数据库中创建动态 ng-model 存储

typescript - 从 TypeScript 中的基本类型创建唯一类型?

typescript - TypeORM:更新项目并返回

node.js - 在 Angular 中上传文件 - 显示在 req.body 中,而不是 Nodejs 服务器的 req.files 中

angular - 类型 'Observable<{}> is not assignable to type ' 可观察'