简化问题:假设我们有一个图,并且每个 node 都有其唯一的名称.如果我们有一个类型,将图的边描述为从名称到 node 名称列表的映射,我们将如何做到这一点?
从逻辑上讲,这应该是这样的:
type EdgesT = { [name: string]: Exclude<keyof EdgesT, name>[]; };
但是,即使没有排除部分,我也无法使该描述起作用,因为它总是将Keyof EdgesT视为字符串.
或者,如果函数参数也有同样的问题,我们可以这样做:
type BuildEdges<T> = { [Name in keyof T]: Exclude<keyof T, Name>[]; };
const fn = <T>(edges: BuildEdges<T>) => null;
对于这种明确的情况,这是可行的.但如果我们要从类型参数中获得更多信息(对于其他东西),我们就不能.对于类型参数,<T>
可以,<T extends Record<string, any>>
可以,<T extends Record<string, unknown>>
可以,但其他任何东西都不能.例如,<T extends Record<string, number>>
不能工作--有人知道为什么吗?
有没有想过解决这种情况、取得更多成就或描述这种限制的 idea ?