Вы можете использовать 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
, чтобы принимать объект вместо отдельных параметров.