使用 Typescript 的条件输入
Conditional Typing with Typescript
我有两个 classes ClassA
和 ClassB
如下:
interface IClassA {
functionA: ()=> void
}
class ClassA implements IClassA{
functionA(){
console.log('hello world A')
}
}
interface IClassB {
functionB: ()=> void
}
class ClassB implements IClassB{
functionB() {
console.log('hello world B')
}
}
我有另一个函数需要将 ClassA
或 ClassB
的实例作为参数,如下所示。
function sayHello(object) {
// ...
}
如何根据正在使用的 class 实例键入 object
以访问函数 functionA
或 functionB
?下面的代码将不起作用:
function sayHello(object: IClassA | IClassB)
我不想使用通用 any
类型。谢谢。
Union Types
您实际上可以使用 |
运算符来创建联合类型。如果您的 classes 有单独的逻辑,您可以使用 instanceOf
语法在 运行 class 特定代码之前检查您的 class。
function sayHello(input: ClassA | ClassB) : string {
if (input instanceof ClassA) {
input.A();
}
}
您可以在尝试调用对象之前检查对象中的 functionA
。
示例 (playground):
function sayHello(obj: IClassA | IClassB) {
if ('functionA' in obj) {
obj.functionA()
}
}
我有两个 classes ClassA
和 ClassB
如下:
interface IClassA {
functionA: ()=> void
}
class ClassA implements IClassA{
functionA(){
console.log('hello world A')
}
}
interface IClassB {
functionB: ()=> void
}
class ClassB implements IClassB{
functionB() {
console.log('hello world B')
}
}
我有另一个函数需要将 ClassA
或 ClassB
的实例作为参数,如下所示。
function sayHello(object) {
// ...
}
如何根据正在使用的 class 实例键入 object
以访问函数 functionA
或 functionB
?下面的代码将不起作用:
function sayHello(object: IClassA | IClassB)
我不想使用通用 any
类型。谢谢。
Union Types
您实际上可以使用 |
运算符来创建联合类型。如果您的 classes 有单独的逻辑,您可以使用 instanceOf
语法在 运行 class 特定代码之前检查您的 class。
function sayHello(input: ClassA | ClassB) : string {
if (input instanceof ClassA) {
input.A();
}
}
您可以在尝试调用对象之前检查对象中的 functionA
。
示例 (playground):
function sayHello(obj: IClassA | IClassB) {
if ('functionA' in obj) {
obj.functionA()
}
}