Создать массив с дополнительным свойством

Я использую существующий сторонний 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' }); (этот, очевидно, не работает).

1
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, это функция, которую вы хотите вызвать:

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 }, который я хочу создать как можно проще. Спасибо, в любом случае!

qqilihq 13.09.2018 19:06

О, я думал, вы оборачиваете библиотечную функцию своей собственной функцией. Теперь я вижу проблему :) - обновил свой ответ.

Dániel Kis-Nagy 13.09.2018 19:11

Ааа, идея с Object.assign мне не пришла в голову. Идеально!

qqilihq 13.09.2018 19:17

Другие вопросы по теме