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函数,在所有情况下都没有参数包装类型。