Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何只指定函数的返回类型而不指定参数?_Typescript_Generics_Typescript Typings_Typescript Generics - Fatal编程技术网

Typescript 如何只指定函数的返回类型而不指定参数?

Typescript 如何只指定函数的返回类型而不指定参数?,typescript,generics,typescript-typings,typescript-generics,Typescript,Generics,Typescript Typings,Typescript Generics,代码如下: const t={ k1:null, k2:null, } 常数a={ k1:()=>null, k2:(arg1:number)=>null, } a、 k1() a、 k2() 现在我想让对象“a”由对象“t”中的键控制,我想当我将“t”上不存在的键k3、k4写入“a”时,应该有一个错误 所以我试着这样做 const t={ k1:null, k2:null, } 常数a:记录无效>={ k1:()=>null, k2:(arg1:number)=>null, } a、 k1(

代码如下:

const t={
k1:null,
k2:null,
}
常数a={
k1:()=>null,
k2:(arg1:number)=>null,
}
a、 k1()
a、 k2()
现在我想让对象“a”由对象“t”中的键控制,我想当我将“t”上不存在的键k3、k4写入“a”时,应该有一个错误

所以我试着这样做

const t={
k1:null,
k2:null,
}
常数a:记录无效>={
k1:()=>null,
k2:(arg1:number)=>null,
}
a、 k1()
a、 k2()
但当我调用a.k2时,并没有参数提示,即使我并没有输入参数,编译器也并没有错误

因此,我在脑海中写下:

const t={
k1:null,
k2:null,
}
常数a:记录为空>={
k1:()=>null,
k2:(arg1:number)=>null,
}
a、 k1()
a、 k2()
但是,编译器中有一个错误:

“args”在其自己的类型批注中直接或间接引用

我最后想要的是:

const t={
k1:null,
k2:null,
}
常数a:??={
k1:()=>null,
k2:(arg1:number)=>null,
k3:()=>null,//应该有一个错误,比如在typeof t的keyof中不存在'k3'
}
a、 k1()
a、 k2()//应该有一个错误,如未提供“arg1”的参数。
我不知道类型“?????”应该替换为什么


我能为“关键控制和参数提示”做些什么?或者我如何只指定函数的返回类型而不指定参数?

您不能在类型批注中指定变量的类型,并让编译器从初始化表达式推断该变量的详细信息

你能做的就是使用一个函数。函数既可以从参数推断,也可以根据约束检查这些参数:

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
const t={k1:null,k2:null}
函数asFunctions(){
返回函数>(o:U){
返回o
}
}
常数a=asFunctions()({
k1:()=>null,
k2:(arg1:number)=>null,
});
a、 k1()
a、 k2()//现在出错

但现在我被允许在“a”中添加k3和k4,它们在“t”中不存在,我认为这是要求。。您可以将其更改为不需要
t
中的密钥,如下所示:这是一项要求,我不想将k3 k4添加到“a”中,而“t”中不存在。您可以在那里看到它,我想要k3,但有一个错误:)@Ztory抱歉回复太晚,泛型禁用多余的属性检查。我们可以像这样将它们添加回: