首页 > 解决方案 > TypeScript - 具有满足一个接口和其他两个接口之一的值

问题描述

给定接口:

interface OperationHandler {
  IsCreatedByEvent(event: KeyboardEvent): boolean;
}

interface StatelessOperationHandler {
  GetStatelessOperation(): StatelessOperation;
}

interface StatefulOperationHandler {
  GetStatefulOperation(): React.ElementType;
}

我想处理满足OperationHandlerand 或StatelessOperationHandleror的值StatefulOperationHandlerGetStatelessOperation()如果值满足则调用,如果满足则StatelessOperationHandler调用。StatefulOperationHandler()StatefulOperationHandler

就像是:

function fireOperationHandler(): void {
  const selectedHandler: OperationHandler = selectOperationHandler();
  if (selectedHandler satisfies StatefulOperationHandler) {
    selectedHandler.GetStatefulOperation();
    //more logic
  } else {
    //here can assume selectedHandler satisfies StatelessOperationHandler
    selectedHandler.GetStatelessOperation();
    //more logic
  }
}

function selectOperationHandler(): OperationHandler {
  // return a value that:
  // - satisfies OperationHandler
  // - satisfies either StatelessOperationHandler or StatefulOperationHandler
}

我一直在尝试各种交集和联合类型的东西,但不太确定如何做到这一点。你会使用什么样的语法或模式来做到这一点?

标签: typescripttypescript-typings

解决方案


您不能在 TypeScript 中执行此操作,因为在将 TS 代码转换为 JavaScript 代码时会忽略类型。您必须手动检查对象中是否存在所有键或使用类,而不是使用接口,因此您可以像这样使用 instanceof 方法:

let a = new A();
let b = new B();

let value: A | B = Math.random()>0.5 ? a : b; // choose a or b randomly

if(value instanceof A){
  // this object is instance of class A
} else if(value instanceof B){
  // this object is instance of class B
}

根据您的用例,您可以创建包含接口类型的对象的包装类,或者将数据完全存储在基于类的对象中。


推荐阅读