【发布时间】: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