Javascript Typescript泛型返回类型问题
我在我的项目中使用了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)
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}