Class 键入的 Rest 参数被视为来自 typescript 的任何参数

Class typed Rest Parameters is treated like any from typescript

我正在尝试将我的正式 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);

这是我的代码部分的简化,有 class 命名为 'A' 和函数 'a' 需要数字类型索引和 [=31= 的实例数量] 'A'.

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

但它有效。

它将此打印到控制台

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

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

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

因为 A 是一个空的 class,它所拥​​有的唯一属性就是所有对象所拥有的属性; .toString.valueOf 之类的东西。 number 也具有所有这些相同的属性,数组也是如此,所以您传入的 确实 与您要求的相匹配。

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

Playground link