Определите тип объекта с помощью строковых ключей и значений функций - PullRequest
1 голос
/ 04 октября 2019

У меня есть функция узла JS с одним параметром, который является объектом с ключами, а значения являются функциями, которые затем разрешают базовые значения.

Мы только что переключились на TS, и я не знаю,как определить ключ: типы значений параметра и, кроме того, я не знаю, как определить function в качестве типа значения?

Функция TS выглядит следующим образом ...

const myJSFunction = o => input => ...

Где o - это string:function объект. И input затем передается в каждую из функций values из o.

Так что я думал о том, чтобы иметь какую-то сигнатуру по линии ...

// define the generic <R> function as <U => any>
// define the generic <T> as an object of { string : R }
const myTSFunction = (o: T) => (input: U) => ...

Или что-то? Я хватаюсь за соломинку, потому что я недостаточно хорошо знаю Typescript, чтобы понять, что возможно с генериками.

Спасибо

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Как насчет этого:

// We define what the type o is
// key: string means "any key should ..."
interface Obj<T> {
  [key: string]: (input: T) => void,
};

// We instantiate an object for the test
const o: Obj<string> = {
  a: (input) => { },
  b: (input) => { },
};

// We define the function to work with any type of value of obj
// and call it for the test
function myTSFunction<T>(obj: Obj<T>, val: T): void {
  obj[0](val);
}
0 голосов
/ 04 октября 2019

Ответ Грегори NEUT очень помог, но были некоторые другие ограничения, которые я обнаружил на пути (что JS скрывался). Я использую Lodash, поэтому мой объект был не просто объектом, а типом, который они определили.

Итак, я определил несколько новых типов ...

type TransformerFunction<T> = (o: T) => any;
type TransformerObject<T> = Dictionary<TransformerFunction<T>>;

И затем функция сталакак ...

export const objectTransform = <T extends any>(o: TransformerObject<T>) => <U extends T>(json: U): Dictionary<any> => _.flow(
  _.mapValues((f: TransformerFunction<T>) => f(json)),
  _.omitBy(_.isUndefined),
  _.omit('undefined'),
)(o);

Вот как я преобразовывал JSON в JS, а теперь перенёс его в TS и полюбил дженерики.

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