TypeScript和...args

3
TypeScript应当出现“期望获得1个参数,但未传递任何参数”的错误信息,但实际却没有。
type PolyElement = [number, number];

export interface Node {
  element: PolyElement | null;
  next: Node | null;
}

export class Node {
  constructor(element?: PolyElement) {
    this.element = element ?? null;
    this.next = null;
  }
  add(...args: PolyElement[]) {
    for (let i = 0; i < args.length; ++i) {
       //some code
      }
    }
  }

然后我这样调用方法:

poly1.add([1,2,3]);

它的输出结果是:[number, number, number]类型的参数不能赋值给PolyElement类型的参数。属性length的类型不兼容,3不能被赋值给2。ts(2345)

另外:

poly1.add([]);

输出: 类型 '[]' 的参数不能赋值给类型 'PolyElement' 的参数。类型 '[]' 缺少类型 '[number,number]' 的以下属性:0, 1ts(2345)

等。

问题是为什么:

poly1.add();

不会输出类似于:期望至少有1个参数,但实际却没有。吗?


1
你的答案已经在你的问题中了:“类型为'[]'的参数...”。空数组算作一个参数,只是类型不对。 - jdaz
抱歉,我在复制时犯了一个错误。我已经更正了我的问题。现在是 poly1.add(); - pusiadestroyer42
这个回答解决了你的问题吗?在TypeScript中的可变参数方法中期望至少一个参数 - Emile Bergeron
1
@EmileBergeron 是的,但在这个帖子中,对这个问题的回答比你链接的另一个帖子中更好。 - pusiadestroyer42
是的,现在有了!理想情况下,其他问题应该链接到这个更新的问题上。 - Emile Bergeron
2个回答

5
这个语法
add(...args: PolyElement[]) {

mean “传递任意数量的参数(包括零)”。

您可以使用以下语法来强制传递至少一个参数:

add(...args: [PolyElement, ...PolyElement[]]) {

你能帮忙提供传递多个PolyElement类型参数的最佳语法吗? - pusiadestroyer42
也许可以用 add(el: PolyElement, ...args: PolyElement[])?但你需要显式地处理 el - Emile Bergeron
1
说实话,你比我先得到这个。我只是添加了一点来强制至少有一个“PolyElement”。 - zero298
这就是问题所在,如果不使用它,那么就意味着你明确地忽略了第一个参数。 - Emile Bergeron
现在我更喜欢这个答案(仍然点赞了两个)。而且在寻找重复候选时,没有看到任何类似的东西。 - Emile Bergeron
@RyanCavanaugh 这就是我在寻找的语法。非常感谢你。 - pusiadestroyer42

3

Rest arguments ... 意思是0个或多个参数。如果你至少需要一个参数,则应该显式地接受第一个参数,然后接受“其余的”。

type NumArr = [number, number];

// Forces at least 1 NumArr
const foo = (a: NumArr, ...b: NumArr[]) => {
    const all = [a, ...b];
    console.log(all);
}

const bar = () => {
    foo([1, 2]); // Good!
    foo([]); // Wrong type, [] is not [number, number]
    foo(); // Expected at least 1 arg
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接