【问题标题】:Class typed Rest Parameters is treated like any from typescript类类型化的 Rest 参数被视为来自打字稿的任何参数
【发布时间】:2020-06-03 13:40:07
【问题描述】:

我正在尝试将我的正式 Javascript 项目迁移到 Typescript,并且遇到了非常奇怪的事情。

class A { }

function a(i: number, ...args: A[]): void {
    console.log(i, args);
}

const b = new A();
const c = [new A(), new A(), new A()];

a(0, 45);
a(1, c);
a(2, b, b, b);

这是我代码部分的简化,有一个名为“A”的类,函数“a”需要一个数字类型索引和“A”类的实例数量。

在我的预期中,这段代码应该会出错。因为45是数字,c是数组。

但它有效。

将其打印到控制台

0 [ 45 ]
1 [ [ A {}, A {}, A {} ] ]
2 [ A {}, A {}, A {} ]

我错过了什么?它是运行时错误吗? (我使用 deno 作为 javascript/typescript 运行时) 或者,Typescript 允许这样做有什么原因吗?

我是 Typescript 的新手,所以我需要一些建议。

【问题讨论】:

  • 在您的示例中,A 是一个空类,这不是一件很有用的事情。如果您向 A 添加属性,它会继续行为不端吗?
  • 或者你可以使用接口或类型来代替类吗? stackblitz.com/edit/typescript-jcatbe
  • @NicholasTower 非常感谢。具有某些属性,编译器可以正常工作。但是我还是觉得很奇怪,因为如果属性的存在很重要,这意味着打字稿不会区分具有相同数据结构的类的类型,然后,它可能会导致一些错误。我担心......你知道,有时需要一些“类型”,即使它不包含任何有用的数据
  • It means typescript doesn't separate types of classes which has same data structure 完全正确。 Typescript 进行结构打字,而不是名义打字。有一些关于将来添加名义类型的讨论,并且存在一些模仿名义类型的变通办法,但仅此而已。

标签: javascript typescript args


【解决方案1】:

由于 A 是一个空类,它唯一的属性是所有对象都具有的属性; .toString.valueOf 之类的东西。 numbers 也具有所有这些相同的属性,数组也是如此,因此您传入的内容确实符合您的要求。

向 A 添加属性后,此问题就会消失。例如,如果您添加一个id: string 属性,那么现在数字和数组都不会匹配,因为它们没有这样的属性。

Playground link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2020-05-11
    • 2018-05-02
    • 1970-01-01
    • 2016-06-18
    • 2022-11-11
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多