如何在Function中同时使用接口和泛型

时间:2019-04-17 14:10:53

标签: typescript

如何在实现接口的函数中使用泛型

在示例代码中,我如何实现接口或类型,该接口或类型提取了“ xFunc”和“ yFunc”中的通用性,并且可以使用“ wantFunc”来实现它来应用诸如xFunc和myFunc之类的wantFunc

我可以使用'wantFunc'来实现ITFunc而不指定适用的通用T util吗?

interface IFunc {
  (arg : any): string
}
interface ITFunc<T> {
  (arg : T): string
}
const myFuc: IFunc = (a) => a + 'my'
myFuc(null)
const stringFunc:ITFunc<string> = (arg) => arg + 'a'
const numberFunc:ITFunc<number> = (arg) => arg + 'b'
const xFunc = <T>(arg: T) => arg + 'x'
const yFunc = <T>(arg: T) => arg + 'y'
const wantFunc:ITFunc<T> = <T>(arg: T) => arg + 'want' // mistake
stringFunc('sss')
numberFunc(123)
xFunc<string>('ss')
yFunc<number>(123)
wantFunc<string>('ds') // how to do

1 个答案:

答案 0 :(得分:1)

没有表达这种想法的语法方法:“我希望此值具有多个泛型类型”。但是,Typescript在结构上是类型化的,这意味着您不必某事物具有给定的类型就可以具有该类型;如果满足相应的接口,它就只是具有该类型。因此,这是您可以通过删除类型注释来解决问题的罕见情况之一。

const wantFunc = <T>(arg: T) => arg + 'want';

然后我们可以将其称为

wantFunc<string>("A");
wantFunc<number>(99);

而且,为了确认,它仍然是ITFunc<T>(对于适当的T),因为我们可以将其分配给适当(单态)类型的变量。

let wantFuncN: ITFunc<number> = wantFunc;
let wantFuncS: ITFunc<string> = wantFunc;