我正在使用现有的第三方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 }));