我想定义一个类型NodeDef
,它定义了图执行框架中的一个 node .每个NodeDef
具有name
、其依赖(其输入)的 node 的列表deps
以及基于输入来计算其输出的函数compute
.
我希望将compute
函数的参数限制为将deps
下指定的字符串文字作为属性的对象:
type Nodes = {
a: number;
b: number;
c: string;
};
type Node = keyof Nodes;
type NodeDef<N extends Node, D extends Node> = {
name: N;
deps: D[];
compute: (deps: { [K in D]: Nodes[K] }) => Nodes[N];
};
type Graph = {
[K in Node]?: NodeDef<K, Node>;
};
但是,当我创建图形时,配置计算函数的类型没有正确提供:
const config: Graph = {
a: {
name: 'a',
deps: ['b'],
compute: ({ b, c }) => { // <-- 'c' shouldn't exist here
return 2 * b + c.length;
},
},
};
我预计推断的类型为:
(property) compute: (deps: {
b: number;
}) => number
然而,它是:
(property) compute: (deps: {
a: number;
b: number;
c: string;
}) => number
如何让TypeScript按照我想要的方式推断类型?