我想设置一个具有Format方法的配置对象.

我似乎无法对Format方法的参数进行类型判断

export interface Config<D, ConfigId extends keyof D> {
  id: ConfigId
  format?: (value: D[ConfigId]) => any
}

type Data = {testA: number, testB: string}

const configObjs: readonly Config<{testA: number, testB: string}, keyof Data>[] = [
  {
    id: 'testA',
    format: (value) => {
      return value
    },
  },

]

我试过很多次了.什么都做不了.

我期望/希望上面例子中的format方法中的arg只是一个数字.

以下是一份Typescript 操场上的Typescript ,上面写着它们能持续多久,但: https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBASwHY2FAZgQwMbDgYQiXQQHMAeAEQBoCiTSBJAEzlFSWYGc4BrYAJ4R0cSgD44AbwBQcRMwBcdYmRay46aAFtMMAPxKAFADdMAGwCuwJZQDahFU2YBdAJRwAvBMxIB0gL7S0jACYHiUupieUqhcMACCSkgWWgBGaLSxMABCSnFQyKSB0thEcXCljgDyqQBWXEpQwJjMRGYCygzkklmJcMlpGXBZuXD5hf60-EIiETCYYrbO0bbqMnJyCIpwAOS9O9TqcppQOjBGppbA7l5SRxtNMBZQSHCXVveT6l-SztJAA

推荐答案

你想让Config<D, K>变成distributive over 100 in 102.这意味着,例如,Config<D, K1 | K2 | K3>应该扩展到Config<D, K1> | Config<D, K2> | Config<D, K3>,其中K中的每个键具有其自己的对象类型,从而idvalue将在每个联合成员中匹配.但是现在,您得到的是具有联合id和联合value回调参数的单一对象类型,该参数混合而不是匹配.

有几种方法可以将非分配类型转变为分配类型.当你分配超过keyskeylike types的时候,我通常使用被称为distributive object type的东西,就像microsoft/TypeScript#47109中创造的那样.它包括在密钥上进行mapped type,然后立即使用密钥对其进行indexing into,以获得联合结果.所以如果F<K>K中是非分配的,你可以写{[P in K]: F<P>}[K]}来获得分配版本.

那么,对于您的示例,这看起来就像

type Config<D, K extends keyof D> = { [P in K]: {
  id: P
  format?: (value: D[P]) => any
} }[K]

请注意,这是type alias而不是interface,因为接口不能是联合.

让我们来测试一下:

type Data = { testA: number, testB: string }

type Test = Config<Data, keyof Data>;
/* type Test = {
    id: "testA";
    format?: ((value: number) => any) | undefined;
} | {
    id: "testB";
    format?: ((value: string) => any) | undefined;
} */

看上go 不错.现在Config<Data, keyof Data>是你想要的形状的discriminated union,所以在里面

const configObjs: readonly Config<Data, keyof Data>[] = [
  {
    id: 'testA',
    format: (value) => {
      //     ^?(parameter) value: number
      return value
    },
  },   
]

一切都正常,因为编译器可以通过判别式id的属性"testA"来区分该并集,而value回调参数是contextually,推断为number.

Playground link to code

Javascript相关问答推荐

React Hooks中useState的同步问题

仅圆角的甜甜圈图表

如何分配类型脚本中具有不同/额外参数的函数类型

如何在使用fast-xml-parser构建ML时包括属性值?

如何从调整大小/zoom 的SVG路径定义新的d属性?""

我怎么才能得到Kotlin的密文?

在JS中拖放:检测文件

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

使用Java脚本导入gltf场景并创建边界框

更改预请求脚本中重用的JSON主体变量- Postman

有条件重定向到移动子域

如何使用基于promise (非事件emits 器)的方法来传输数据?

如何在和IF语句中使用||和&;&;?

在渲染turbo流之后滚动到元素

如何在FiRestore中的事务中使用getCountFromServer

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

由于http.get,*ngIf的延迟很大

观察子组件中的@Output事件emits 器?

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;

使用重新 Select 和对象理解 Select 器备忘