如何在typescript中同时启用IntelliSense和索引器



例如,我有一个对象:

const obj = {
a: (valueA: string) => true;
b: (valueB: string) => false;
c: (valueC: string) => false;
};

您可以看到该对象中的所有属性都具有相同的类型((value: string) => boolean(。现在我希望它有IntelliSense,这使得以下成为可能:

  1. 键入obj.后显示abc
  2. 当我尝试将属性添加到obj中时,请限制其类型

我尝试了索引器:

const obj: Record<string, ((value: string) => boolean)> = {
a: (valueA: string) => true;
b: (valueB: string) => false;
c: (valueC: string) => false;
};

但现在目标1不会实现,如果我不使用索引器,我就无法实现目标2。

变量推理要么全有要么全无,要么让typescript推断类型,要么自己指定类型。

你只能通过一个助手功能来做到这一点:

function makeFunctionsMap<T extends Record<string, ((value: string) => boolean)>>(o: T) { return o; }
const obj = makeFunctionsMap({
a: (valueA: string) => true,
b: (valueB: string) => false,
c: (valueC: string) => false,
})
obj.a;
obj.d // Error

游乐场链接

如果你想让它更短、更不可读,你也可以内联这个函数(Playground Link(

最新更新