有没有可能使几个嵌套的对象属性相互依赖
大概是这样的
type func = (props: any) => ...
type Obj = {
[key: string]: {
f: func, args: PARAMETERS OF "f",
f1: func, args1: PARAMETERS OF "f1"
...
}
}
const demo: Obj = {
// here the type of "args" should be {name: string, age: number}
key1: {f: (props: {name: string, age: number}) => ..., args: HERE SHOULD BE TYPED},
// here the type of "args" should be {somethingRandom: number[]}
key2: {f: (props: {somethingRandom: number[]}) => ..., args: HERE SHOULD BE TYPED},
... more properties
}
1条答案
按热度按时间bq3bfh9z1#
TypeScript中没有与您希望
Obj
接受的值完全对应的特定类型。相反,您可以编写一个generic类型Obj<T>
,它充当T
的约束,以便如果T extends Obj<T>
,则T
是可接受的。否则Obj<T>
将是T
的某个“正确”版本。然后您可以编写一个通用的助手函数asObj(obj)
,它返回其输入,但是如果obj
对于某些T
不是有效的Obj<T>
,则会警告您。也就是说,我们要写
然后就像
但更有可能的是
因为前一个版本可能不起作用(可能是循环约束),并且可能产生不合适的输出类型(可能是
Obj<{⋯}>
而不是{⋯}
,这可能是不同的)。现在的问题是如何定义
Obj<T>
。由于
Obj
类型的每个属性都是独立测试的,因此我们可以将其设置为mapped type,而不是其他检查单个属性的类型函数:现在我们需要定义
F<>
:所以
F<T>
应该验证T
是一个有效的Obj
属性。(您可以通过修改Suffixes
联合来选择数量)。我们需要f
,f1
,f2
等,是一个参数的函数(函数(props: never) => void
将接受任何one-arg函数),我们需要args
,args1
,args2
等,是相应f
函数的有效参数类型。这些都是用Record
实用程序类型和条件类型推断表示的;本质上,对于每个argXX
,它在T
中查找fXX
函数并推断其参数类型。好了,让我们来测试一下:
看起来不错。编译器强制每个
arg
对应于每个f
,如果你犯了错误,你会得到一个错误。而且demo
的类型足够强大,它可以记住哪些参数对应于哪些方法。Playground代码链接