我想创建一个函数,它接受obj
和value
作为参数,并使用传递的值运行对象方法add
。不幸的是,对象可以是A
或B
类型。根据对象类型,方法add
接受string
或number
。我该如何实现呢?
class A {
add(a: number) {
return 10 + a
}
}
class B {
add(a: string) {
return 'ten' + a
}
}
我试着做这样的事情,但 typescript lints它(我明白这一点)。
const runObejctMethod = (obj: A | B, value: string | number) =\> {
obj.add(value)
}
错误:
TS2345: Argument of type 'string | number' is not assignable to parameter of type 'never'. Type 'string' is not assignable to type 'never'
4条答案
按热度按时间jgzswidk1#
若要建立可接受不同型别对象的函式,并以传递的值执行其add方法,您可以使用型别保护来检查对象的型别,然后呼叫适当的方法。
以下是如何实现此函数的示例:
在本例中,runAdd函数接受类型为A或B的对象obj和任何类型的值value。然后,它使用类型保护检查obj的类型,并使用传递的值调用相应的add方法。然后,您可以使用此函数调用类型为A或B的对象的add方法,该对象具有任何类型的值。
zbsbpyhn2#
您可以尝试使用类型保护来确定对象的类型,然后调用正确的方法。您可以通过使用
typeof
运算符检查对象的类型,或者通过检查对象上是否存在特定的属性来实现这一点。下面是使用
typeof
运算符的示例:在这个例子中,我们使用
typeof
操作符来检查obj
的类型。如果它是A
的一个示例,我们调用add
方法,并使用as
关键字显式键入一个数字。否则,我们调用add
方法,并使用一个字符串显式键入一个值。也可以通过检查对象上是否存在特定属性来使用类型保护。例如,可以将名为
isA
的属性添加到A
类,并在类型保护中使用它,如下所示:在本例中,我们检查
obj
对象的isA
属性是否存在。如果存在,我们就知道obj
是A
的示例,并且我们调用add
方法,该方法带有一个显式类型为number
的值。如果isA
属性不存在,我们知道obj
是B
的一个示例,并且我们调用add方法,该方法带有一个显式类型化为字符串的值。8hhllhi23#
您可以使用泛型
还有其他方法(如overloaning),但它们可能需要使用
as
或长泛型进行转换plupiseo4#
您可以使用一般条件约束的函式签章来接受
add
方法与条件约束相容的对象。您也可以使用型别公用程式,从您选择的特定类别定义条件约束的相容性。
我在下面代码的注解中对此进行了更多的解释:
TSPlayground
c
不是兼容的对象类型,但如果您已将其包含在原始约束中,则允许:TSPlayground