Javascript 使用附加属性创建数组
我使用的是一个现有的第三方API,对此我没有控制权,需要我传递一个带有附加属性的数组。如下所示:Javascript 使用附加属性创建数组,javascript,arrays,typescript,Javascript,Arrays,Typescript,我使用的是一个现有的第三方API,对此我没有控制权,需要我传递一个带有附加属性的数组。如下所示: type SomeArgument = string[] & { foo: string }; doSomething (argument: SomeArgument); 现在,我发现创建SomeArgument,同时让编译器满意,这是非常笨拙和冗长的 这一个可行,但根本没有类型安全: const customArray: any = ['baz']; customArray.foo =
type SomeArgument = string[] & { foo: string };
doSomething (argument: SomeArgument);
现在,我发现创建SomeArgument
,同时让编译器满意,这是非常笨拙和冗长的
这一个可行,但根本没有类型安全:
const customArray: any = ['baz'];
customArray.foo = 'bar';
doSomething(customArray);
另一个感觉更干净但非常详细的选项(我需要具有不同属性的不同子类)是将数组子类化:
class SomeArgumentImpl extends Array<string> {
constructor (public foo: string, content?: Array<string>) {
super(...content);
}
}
doSomething(new SomeArgumentImpl('bar', ['baz']));
class SomeArgumentImpl扩展了数组{
构造函数(公共foo:string,content?:数组){
超级(…内容);
}
}
doSomething(newsomeargumentimpl('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 }));
不完全是我想要的:doSomething
实际上是一个我无法控制的第三方库函数。我只需要提供一个string[]&{foo:string}
类型的参数,我希望尽可能简单地创建它。无论如何谢谢你!哦,我还以为你在用自己的函数包装库函数呢。我现在看到问题了:)--更新了我的答案。啊,我没有想到Object.assign
的想法。完美的