您可以使用Object.values 来获取对象的值。问题是顺序不一定得到保证,因此这极易出错,因为顺序通常在函数参数中很重要:
Object.values({param1: 'blah', param2: 10}) // ["blah", 10]
Object.values({param2: 10, param1: 'blah'}) // [10, "blah"]
所以例如在 JS 中这会起作用:
function foo(param1: string, param2: string) { console.log(param1, param2)}
let obj = { param1: 'blah', param2: "10" }
foo(...Object.values(obj));
TS 不允许上述情况,因为它无法确定 values 返回的内容是否包含两个项目,因此唯一允许且可取的地方是如果您有一个 rest 参数:
declare function foo(...param1: string[]): void;
let obj = { param1: 'blah', param2: "10" }
foo(...Object.values(obj));
您可以创建一个函数来将对象值提取到元组中并将其传播到值中,但此时您最好使用常规语法。我在下面介绍这个版本主要是为了获得一些元组类型的乐趣:
declare function foo<T>(param1: string, param2: number): void;
function args<T, K extends (keyof T)[]>(o: T, ...keys:K) : { [P in keyof K]: K[P] extends keyof T ? T[K[P]]: never} {
let r : any[] = []
for (const key of keys) {
r.push(o[key]);
}
return r as any;
}
let obj = { param1: 'blah', param2: 10 }
foo(...args(obj, 'param1', 'param2'));
注意更好的解决方案是更改foo 以接收对象而不是单独的参数。