这样的代码:
const t = {
k1: null,
k2: null,
}
const a = {
k1: () => null,
k2: (arg1: number) => null,
}
a.k1()
a.k2()
现在我希望对象“ a”将由对象“ t”中的键控制,我想要在我将k3,k4写到“ a”时不存在该键,并将其写到“ a”时,应该有一个错误
所以我尝试这种方式
const t = {
k1: null,
k2: null,
}
const a: Record<keyof typeof t, (...args: any[]) => void> = {
k1: () => null,
k2: (arg1: number) => null,
}
a.k1()
a.k2()
但是当我调用a.k2时,没有关于args的提示,即使我没有输入参数也没有来自编译器的错误。
所以,我在脑海中写下了什么:
const t = {
k1: null,
k2: null,
}
const a: Record<keyof typeof t, (...args: Parameters<typeof a[keyof typeof t]>) => null> = {
k1: () => null,
k2: (arg1: number) => null,
}
a.k1()
a.k2()
但是,编译器出现错误:
'args'在其自己的类型注释中直接或间接引用。
我最后想要的是:
const t = {
k1: null,
k2: null,
}
const a: ????? = {
k1: () => null,
k2: (arg1: number) => null,
k3: ()=>null, // should have an error like, 'k3' does not exist in keyof typeof t
}
a.k1()
a.k2() // should have an error like, An argument for 'arg1' was not provided.
我不知道输入“ ?????”应该替换为什么。
“键控和&参数技巧”这两个都可以做什么?还是只为函数指定返回类型,而不指定参数?
答案 0 :(得分:0)
您不能在类型注释中指定变量的类型,而让编译器从初始化表达式中推断出该变量的详细信息。
您可以做的是使用一个函数。一个函数可以在根据约束检查那些参数的同时从参数推断:
const t = { k1: null, k2: null }
function asFunctions<T>() {
return function <U extends Record<keyof T, (...args: any[]) => void>>(o: U) {
return o
}
}
const a = asFunctions<typeof t>()({
k1: () => null,
k2: (arg1: number) => null,
});
a.k1()
a.k2() // err now