【问题标题】:One Generic Type in Multiple Functions in TypeScriptTypeScript 中多个函数中的一种泛型类型
【发布时间】:2021-09-11 18:27:56
【问题描述】:

我有多个互相调用的函数:

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"]);
})

是否可以以setConfigc 参数是通用的(取决于实际的配置对象)的方式键入这个,然后自动推断myCallbackconfig 参数的类型?

我已经尝试将事件侦听器的添加放入setCallback 函数中,因此我可以为setConfig 携带一个泛型类型,我想在另一个地方执行此操作并且还可以修改@ 987654329@,但仍然保留类型推断。

【问题讨论】:

  • items 应该是什么类型? getData() 返回什么类型?
  • this 是否满足您的需求?如果是这样,我会写一个答案;如果没有,请详细说明缺少什么或不起作用。

标签: typescript typescript-generics


【解决方案1】:

实现这一点的关键是 Typescript 的 keyof 运算符:

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;
}

【讨论】:

  • 另外,请注意我在setConfig 中重新定义config 对象时添加了items 属性
猜你喜欢
  • 2018-07-03
  • 2020-08-21
  • 1970-01-01
  • 2021-09-07
  • 2021-06-01
  • 2020-09-09
  • 2020-11-15
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多