Javascript Typescript泛型返回类型问题

Javascript Typescript泛型返回类型问题,javascript,typescript,Javascript,Typescript,我在我的项目中使用了typescript泛型,但它似乎工作得不好 例如: interface Test<T, P> { a?: (v: T) => P b?: (v: P) => void } const fn1 = <T, P>(_config: Test<T, P>) => {} fn1({ a: (p) => 1, b: (p) => {}, }) 接口测试{ a?:(v:T)=>P b?:(v:P)

我在我的项目中使用了typescript泛型,但它似乎工作得不好

例如:

interface Test<T, P> {
  a?: (v: T) => P
  b?: (v: P) => void
}

const fn1 = <T, P>(_config: Test<T, P>) => {}

fn1({
  a: (p) => 1,
  b: (p) => {},
})

接口测试{
a?:(v:T)=>P
b?:(v:P)=>无效
}
常量fn1=(_config:Test)=>{}
fn1({
a:(p)=>1,
b:(p)=>{},
})
我认为
params'a'
类型就像:

Test.a:((v:未知)=>数字)|未定义

但是,实际上:

Test.a:((v:未知)=>未知)|未定义


我不知道为什么,有人能帮我吗?谢谢。

因为您没有在此行定义类型:
b:(p)=>{}


那么TS无法推断p的类型,即使您在上面的定义中为
a

返回p,为什么您的界面中有箭头函数?@Phil是否有他/她不应该的原因,或者为什么它可能不可取?(真正的问题)@CertainPerformance我想我遗漏了一些东西(仍然是相对的TS noob),但是你通常不定义接口函数,比如
a?(v:t):P
。我还没有看到箭头的语法。编辑:好的,找到了。。。TIL@Phil据我所知,它们是完全等价的(你甚至可以做一些看起来很傻的事情,比如
a:(this:string,v:T)=>P
),所以无论是使用
=>
还是
语法都只是一个样式选择。我假设你知道你可以显式地指定类型:
fn1({…})
我在
a
上定义类型:
a:1,
,TS可以推断p的类型:
Test.a:((v:string)=>number)|未定义
。这很奇怪,T和P之间有什么联系吗?这是奇怪的行为,看起来TS选择了最安全的类型(最不具体)。我已经使用内置的
ReturnType
类型编写了另一个可能的解决方案,但由于我将
a
用作索引类型,因此需要存在它:
接口测试{a:(v:T)=>pb:(v:ReturnType)=>void}