Typescript 索引类型和泛型函数值
我尝试以下语法时出现编译错误,但我不明白为什么它不起作用:Typescript 索引类型和泛型函数值,typescript,Typescript,我尝试以下语法时出现编译错误,但我不明白为什么它不起作用: interface Param<O> { obj: O; } interface Dico { [key: string]: <O>(param: Param<O>) => Param<O>; } var x: Dico = { fnString: (param: Param<string>) => { return param; },
interface Param<O> {
obj: O;
}
interface Dico {
[key: string]: <O>(param: Param<O>) => Param<O>;
}
var x: Dico = {
fnString: (param: Param<string>) => { return param; },
fnNumber: (param: Param<number>) => { return param; }
};
接口参数{
obj:O;
}
接口Dico{
[键:字符串]:(参数:param)=>param;
}
变量x:Dico={
fnString:(param:param)=>{return param;},
fnNumber:(param:param)=>{return param;}
};
这是你的电话号码
fnString和fnNumber上存在编译错误:
Type '(param: Param<string>) => Param<string>' is not assignable to type '<O>(param: Param<O>) => Param<O>'.
Types of parameters 'param' and 'param' are incompatible.
Type 'Param<O>' is not assignable to type 'Param<string>'.
Type 'O' is not assignable to type 'string'.
Type'(param:param)=>param'不可分配给Type'(param:param)=>param'。
参数“param”和“param”的类型不兼容。
类型“Param”不可分配给类型“Param”。
类型“O”不可分配给类型“string”。
如果我在接口Dico上移动泛型类型O,它可以工作,但我不能像我希望的那样使用不同的类型:
我错过了什么?这是我无法绕过的限制,还是有办法做到这一点?您定义为重新运行索引的函数是一个遗传函数。泛型函数的类型参数由调用方决定,而不是由实现决定,因此只有泛型函数才能与泛型函数签名兼容 您需要的是一个非泛型函数,它可以强制执行输入和输出之间的关系。您可以使用一个额外的函数来帮助进行推断:
interface Param<O> {
obj: O;
}
type Dico < T > ={
[K in keyof T]: (param: Param<T[K]>) => Param<T[K]>;
}
function createDisco<T>(o: Dico<T>) {
return o;
}
var x = createDisco({
fnString: (param: Param<string>) => { return param; },
fnNumber: (param: Param<number>) => { return param; }
fnNumberErr: (param: Param<number>) => { return null as Param<string>; }
})
接口参数{
obj:O;
}
Dico类型={
[K in keyof T]:(param:param)=>param;
}
函数createDisco(o:Dico){
返回o;
}
var x=createDisco({
fnString:(param:param)=>{return param;},
fnNumber:(param:param)=>{return param;}
fnnumberer:(param:param)=>{returnnull as param;}
})
您定义为重新运行索引的函数是一个遗传函数。泛型函数的类型参数由调用方决定,而不是由实现决定,因此只有泛型函数才能与泛型函数签名兼容
您需要的是一个非泛型函数,它可以强制执行输入和输出之间的关系。您可以使用一个额外的函数来帮助进行推断:
interface Param<O> {
obj: O;
}
type Dico < T > ={
[K in keyof T]: (param: Param<T[K]>) => Param<T[K]>;
}
function createDisco<T>(o: Dico<T>) {
return o;
}
var x = createDisco({
fnString: (param: Param<string>) => { return param; },
fnNumber: (param: Param<number>) => { return param; }
fnNumberErr: (param: Param<number>) => { return null as Param<string>; }
})
接口参数{
obj:O;
}
Dico类型={
[K in keyof T]:(param:param)=>param;
}
函数createDisco(o:Dico){
返回o;
}
var x=createDisco({
fnString:(param:param)=>{return param;},
fnNumber:(param:param)=>{return param;}
fnnumberer:(param:param)=>{returnnull as param;}
})
您能否更详细地描述一下您希望实现的目标?你所描述的是完全正常的情况。在前一种情况下,Dico
的值具有接受不同的Param
的泛型函数,或者在后一种情况下,Dico
的所有值都接受Param
。我试图实现第一种情况,一个以泛型函数作为值的类型索引(非泛型)。背后的需要是提出一个接口,其他开发人员可以用尊重“模式”的方法实现,以便在我的代码中使用它们。您能更详细地描述一下您想要实现的吗?你所描述的是完全正常的情况。在前一种情况下,Dico
的值具有接受不同的Param
的泛型函数,或者在后一种情况下,Dico
的所有值都接受Param
。我试图实现第一种情况,一个以泛型函数作为值的类型索引(非泛型)。背后的需要是提出一个接口,其他开发人员可以使用尊重“模式”的方法实现,以便在我的代码中使用它们。谢谢,这正是我所寻找的!正如@Titian所提到的,如果参数不是属性类型的对象,那么它只是Dico、createDisco和调用createDisco函数,在所有情况下都没有参数包装类型。谢谢,这正是我想要的!正如@Titian所提到的,如果参数不是属性类型的对象,那么它只是Dico、createDisco和调用createDisco函数,在所有情况下都没有参数包装类型。