Typescript 强制多个回调具有相同的输入类型而不手动传递泛型

Typescript 强制多个回调具有相同的输入类型而不手动传递泛型,typescript,typescript-generics,Typescript,Typescript Generics,我有以下(简化类型): 这非常有效,TS将认识到回调输入应该是相同的,而不是相同的-我们在第一位number,第二位string,第三位空对象中 但是,一旦我传递了数据generic,TS就不再捕获此错误: const fetchAnimals = createQuery<{ id: string, name: string}>( 'FETCH_ANIMALS', (x: number) => ({ url: '/animals', x }), (x: string

我有以下(简化类型):

这非常有效,TS将认识到回调输入应该是相同的,而不是相同的-我们在第一位
number
,第二位
string
,第三位空对象中

但是,一旦我传递了
数据
generic,TS就不再捕获此错误:

const fetchAnimals = createQuery<{ id: string, name: string}>(
  'FETCH_ANIMALS',
  (x: number) => ({ url: '/animals', x }),
  (x: string) => ({
    getData: data => ({ id: data.id, name: x }),
  }),
);

fetchAnimals({});
const fetchanies=createQuery(
“取动物”,
(x:number)=>({url:'/animals',x}),
(x:string)=>({
getData:data=>({id:data.id,name:x}),
}),
);
获取动物({});
Typescript将不再显示任何错误。我不明白为什么,因为
数据
在理论上与
变量


您可以看到这种行为。

对于泛型而言,Typescript要么全是,要么全是。这意味着您不能指定某些泛型,而让它推断其他泛型。一旦开始指定泛型,就必须全部指定它们

因为您传入了数据泛型参数,所以它现在需要所有泛型值,而不会推断它们


有很多人要求更灵活的模型,但现在你必须使所有泛型都可以推断,这意味着在参数中的某个地方,或者简单地指定所有泛型(可以使用typeof“读取”现有变量的类型。

不要使用
任何
。在哪个地方?回调的返回语句是未知的(这是库代码)和冗余,
是的,但是
字符串
数字
都适合
任何
,如果你想让它们保持一致,只需删除“any”就行了,Typescript不会抱怨“……我不能重现你遇到的问题。你能演示一下吗?@klis87完全不用担心=)哦,我不知道,谢谢!你认为可能有一些解决方法吗?比如使用
推断
和一些条件来强制推断?我认为方法的返回应该是可推断的。我将尝试为你模拟它
const fetchAnimals = createQuery(
  'FETCH_ANIMALS',
  (x: number) => ({ url: '/animals', x }),
  (x: string) => ({
    getData: data => ({ id: data.id, name: x }),
  }),
);

fetchAnimals({});
const fetchAnimals = createQuery<{ id: string, name: string}>(
  'FETCH_ANIMALS',
  (x: number) => ({ url: '/animals', x }),
  (x: string) => ({
    getData: data => ({ id: data.id, name: x }),
  }),
);

fetchAnimals({});