我正在使用现有的第三方API,对此我无法控制,并且需要我传递带有附加属性的数组。类似于以下内容:

type SomeArgument = string[] & { foo: string };
doSomething (argument: SomeArgument);


现在,我发现创建SomeArgument并保持编译器满意的过程非常笨拙和冗长。

这是可行的,但根本没有类型安全性:

const customArray: any = ['baz'];
customArray.foo = 'bar';
doSomething(customArray);


感觉更干净但又很冗长的另一个选择(我将需要具有不同属性的不同子类)是Array的子类:

class SomeArgumentImpl extends Array<string> {
  constructor (public foo: string, content?: Array<string>) {
    super(...content);
  }
}
doSomething(new SomeArgumentImpl('bar', ['baz']));


有没有更好的单线方式?我一直希望在doSomething({ ...['baz'], foo: 'bar' });上有一些东西(显然这是行不通的)。

最佳答案

假设这是您要调用的函数:

function doSomething (argument: string[] & { foo: string }) {
   argument.push("a");
   argument.foo = "4";
   console.log(argument);
}


然后您可以这样称呼它:

// Works
doSomething(Object.assign(["a", "b"], { foo: "c" }));
// Error
doSomething(Object.assign(["a", 2], { foo: "c" }));
// Error
doSomething(Object.assign(["a", 2], { foo: 4 }));

09-18 07:09