развертывание объекта для передачи в качестве аргументов функции - PullRequest
0 голосов
/ 21 декабря 2018

Если у нас есть такая функция:

function foo(param1: string, param2: number);

и подобный объект:

let obj = {param1: 'blah', param2; 10}

Как можно напрямую развернуть объект, чтобы передать его данные аргументам функции?Как то так:

foo(...obj)

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

В дополнение к ответу @Titian Cernicova Dragomir.

Я не смог найти никакого соглашения о том, как это сделать.

Что вы можете сделать (как это предлагает @Titian Cernicova Dragomir) это:

let obj = {param1: 'blah', param2; 10}
function foo({param1: string, param2: number}){}

foo(obj);

или вы также можете сделать ручную деконструкцию

let obj = {param1: 'blah', param2; 10}
function foo({param1: string, param2: number}){}


let {param1, param2} = obj;
foo(obj);
0 голосов
/ 21 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...