如何为实现带泛型函数接口的TypeScript变量声明类型
问题根源
你当前的接口定义把泛型参数T绑定到了接口本身,所以使用接口A时必须先传入具体的类型参数才能作为类型使用。你预期的是函数调用时才确定T的类型,两种解决方案如下:
方案1:调整泛型参数作用域(适合函数本身为泛型、调用时才确定参数类型的场景)
把泛型参数从接口定义挪到内部的调用签名上:
interface A { <T>(foo: T): void }
此时可以直接按预期赋值,不需要额外声明类型参数:
const x: A = (foo) => { console.log(foo) };
调用时可以手动指定类型,也可以由TypeScript自动推断:
x<number>(123); // 手动指定T为number x('test'); // 自动推断T为string
方案2:使用接口时传入具体类型参数(适合声明变量时就确定参数类型的场景)
如果你不需要函数本身是泛型,只是要对特定类型的参数实现该接口,直接在使用A时传入具体的类型即可:
// 比如限定参数只能是string类型 const x: A<string> = (foo) => { console.log(foo) }; x('test'); // 正常调用 x(123); // 类型不匹配报错
你之前第二种写法报错的原因是赋值左侧的T没有在当前作用域声明,箭头函数内部定义的T属于函数内部的作用域,和左侧类型声明的T不属于同一个作用域,因此无法被识别。
内容的提问来源于stack exchange,提问作者Jared Smith
相关产品推荐
相关产品推荐

