当前位置: 首页 > 知识库问答 >
问题:

打字稿中类型和类的区别是什么?

宇文智敏
2023-03-14

typeclass之间的区别是什么?

type Point {
  x: number, y: number
}

let p = new Point();

上述结果如下:

“Point”仅指类型,但在此处用作值。

为什么会这样呢?我肯定不会使用Point作为值,而是使用它来实例化类型。

在哪些情况下,我需要使用类型,因为不合适?

共有3个答案

戴凯歌
2023-03-14

为了更好地理解,我为所有差异创建了一个表:

| Description                                             | Type | Interface |
|---------------------------------------------------------|------|-----------|
| Describe functions                                      |   ✔  |     ✔     |
| Describe constructors                                   |   ✔  |     ✔     |
| Describe tuples                                         |   ✔  |     ✔     |
| Interfaces can extend                                   |   ≈  |     ✔     |
| Classes can extend                                      |   ✘  |     ✔     |
| Classes can implement                                   |   ≈  |     ✔     |
| Divide another one of its own kind                      |   ✔  |     ≈     |
| Create a union with another one of its own kind         |   ✔  |     ✘     |
| Be used to create mapped types                          |   ✔  |     ✘     |
| Be mapped over with mapped types                        |   ✔  |     ✔     |
| Expands in error messages and logs                      |   ✔  |     ✘     |
| Be completed                                            |   ✘  |     ✔     |
| Be recursive                                            |   ≈  |     ✔     |
Hint: `≈` means partially

也许对于新版本的TypeScript,这个表有一些变化,如果有,请通过编辑当前帖子来修复这个表。

曹经业
2023-03-14

您可以使用type(或者在其他情况下使用接口)进行类型注释,以指示JavaScript对象的结构:

type Point = {
  x: number, y: number
}

function doSomething(p: Point) {
}

let p: Point = { x: 10, y: 15 };
doSomething(p);

这些类型注释受结构类型的约束,这意味着在这种情况下,您可以删除类型注释:

let p = { x: number, y: number };
doSomething(p);

类是完全不同的,它为您提供了一个比JS原型继承更优雅的选择:

class Point {
    public x: number;
    public y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    public move(deltaX: number, deltaY: number) {
        this.x = this.x + deltaX;
        this.y = this.y + deltaY;
    }
}

let p = new Point(10, 15);
p.move(1, 2);

当您查看生成的JS代码时,您会很快注意到差异:

在生成的代码中删除type声明。

类定义变成了具有原型继承的JS函数

唐默
2023-03-14

TypeScript在某些方面有两个不同的宇宙:值空间和类型空间。类型空间是定义类型和类型被完全擦除并且在运行时不存在的地方。值空间包含值,并且显然将在运行时存在。

什么是价值?值文字、变量、常量和参数显然都是值。函数和类声明也是值,因为它们有一个运行时对象作为备份,即函数对象和类构造函数(也是函数)。枚举也是值,因为它们在运行时由对象备份。

什么是类型?任何带有type关键字的定义都是类型以及接口、类声明和枚举

您会注意到我在两个空格中都提到了类声明。类存在于类型空间和值空间中。这就是为什么我们可以在类型注释(let foo: ClassName)和表达式(exnew ClassName())中使用它们。

枚举也跨越两个世界,它们还表示可以在注释中使用的类型,还表示将保存枚举的运行时对象。

类型空间和值空间中的名称不冲突,这就是为什么我们可以定义具有相同名称的类型和变量:

type Foo = { type: true }
var Foo = { value : true } // No error, no relation to Foo just have the same name in value space 

类声明和枚举,因为它们跨越两个空间将“用尽”两个空间中的名称,因此我们不能定义与类声明或枚举名称相同的变量或类型(尽管我们可以进行合并,但这是一个不同的概念)

在您的特定情况下,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,我觉得这真的很棒。但我对 和 之间的区别感到困惑。它们之间有什么区别?谁能用适当的例子来解释我?

  • 问题内容: React事件的正确类型是什么。最初,我只是为了简单起见而使用。现在,我正在尝试清理并避免完全使用。 所以像这样一个简单的形式: 我在这里使用什么类型作为事件类型? 似乎没有工作,因为我收到一个错误消息,并且不存在。 对于所有事件的更笼统的回答,我们将不胜感激。 谢谢 问题答案: 该SyntheticEvent接口是通用的: 并且是一般约束与的交集 。 另外,由于事件是由输入元素引起的

  • 这两条线有什么区别 和 或者

  • 问题内容: 斯卡拉 在Scala中,哪里可以观察到类和类型之间的差异?为什么这种区别很重要? 在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响? 或者是根本,以“固定边界”的类型系统(,来我的心)? 爪哇 在Java中还可以识别出上面提到的许多注意事项/差异/问题? (有关语言的介绍,请参见类型和类之间的区别?。) 问题答案: 当您说“类型”时,我将假设您主要是指静态类型。但是我

  • 问题内容: 嗨,我在我的经验中都使用了这两种方法,而我当时在想方法和类型都是 POST 和 GET 方法。 但是似乎它们并不相似。 如果我使用它正在工作,我是一个表格数据。 如果我写它不起作用,谁能解释他们之间的区别是什么..? 帮助是适当的。 问题答案: 类型(默认:’GET’)类型:字符串方法的别名。 如果您使用的是1.9.0之前的jQuery版本, 则应使用 type。 http://api

  • 元类型和? 做和返回一个? 我知道可以用来检查。你如何使用?