TypeScript泛型函数参数不兼容?代码报错原因咨询
问题原因分析
你代码报错的核心是泛型函数类型Func的定义和你的实现funcImpl不匹配:
Func是一个通用泛型函数类型,它要求实现该类型的函数必须能接受任意类型的参数(或不传)——也就是说,调用者可以传入string、number等任何类型,函数都得兼容。- 但你的
funcImpl仅接受Foo类型参数,还在内部把参数当成Foo传给someOtherFunc,这直接违反了Func的泛型约定:如果有人调用funcImpl时传入非Foo类型的值,你的代码必然会出错。
修复方案
如果你确实只想让函数处理Foo类型参数,有两种简单的修复方式:
方案1:去掉Func的泛型,明确参数类型
把Func改为非泛型类型,直接指定参数为Foo:
type Func = (funcParams?: Foo) => void; type Foo = { foofoo: any } const someOtherFunc = (foo: Foo) => {console.log(foo.foofoo);}; const funcImpl : Func = (foo?:Foo) => { foo && someOtherFunc(foo); };
方案2:给Func的泛型加约束,限定为Foo
如果需要保留泛型,但只想让T是Foo或其子类型,可给泛型添加约束:
type Func = <T extends Foo>(funcParams?: T) => void; type Foo = { foofoo: any } const someOtherFunc = (foo: Foo) => {console.log(foo.foofoo);}; const funcImpl : Func = (foo?:Foo) => { foo && someOtherFunc(foo); };
这样Func的泛型T被限定为Foo的子类型,你的实现就符合类型要求了——调用者只能传入Foo或它的子类,内部处理Foo的逻辑是安全的。
内容的提问来源于stack exchange,提问作者Aditya Kumar
相关产品推荐
相关产品推荐

