Один универсальный тип в нескольких функциях в TypeScript

#typescript #typescript-generics

Вопрос:

У меня есть несколько функций, которые вызывают друг друга:

 let config;
let callback;

function setConfig(c) {
  config = {};
  for(const i of c.items) config.items[i] = getData(i);
  return {
    setCallback: (cb) => { callback = cb; }
  };
}

x.addEventListener("someEvent", () => callback(config));

// usage

setConfig({items: ["a", "b", "c"]}).setCallback(function myCallback(config) {
  console.log(config.items["a"]);
  console.log(config.items["b"]);
  console.log(config.items["c"]);
})
 

Можно ли ввести это таким образом, чтобы c аргумент setConfig был общим (зависит от фактического объекта конфигурации), а затем автоматически определить тип config аргумента myCallback ?

Я уже пытался включить добавление прослушивателя событий в setCallback функцию, чтобы я мог использовать универсальный тип для setConfig , я хотел бы сделать это в другом месте , а также иметь возможность изменять config , но при этом сохранять вывод типа.

Комментарии:

1. Какого типа items они должны быть? Какой тип getData() возвращает значение?

2. Подходит ли это для ваших нужд? Если да, я напишу ответ; если нет, пожалуйста, расскажите подробнее о том, что отсутствует или не работает.

Ответ №1:

Ключом к тому, чтобы это сработало, является оператор keyof Typescript:

 interface Config<ConfigItems extends object> {
  items: ConfigItems;
}

type ConfigCallback<ConfigItems extends object> = (
  config: Config<ConfigItems>
) => void;

function setConfig<ConfigItems extends object>(c: {
  items: (keyof ConfigItems)[];
}) {
  config = {
    items: {},
  };

  for (const i of c.items) config.items[i] = getData(i);
  return {
    setCallback: (cb: ConfigCallback<ConfigItems>) => {
      callback = cb;
    },
  };
}
 

Теперь аргумент конфигурации для myCallback будет выведен как:

 Config<{
  a: any;
  b: any;
  c: any;
}
 

Комментарии:

1. Кроме того, обратите внимание, что я добавил это items свойство при переопределении config объекта в setConfig