TypeScript -让一个值满足一个接口和另外两个接口中的一个



给定接口:

interface OperationHandler {
IsCreatedByEvent(event: KeyboardEvent): boolean;
}
interface StatelessOperationHandler {
GetStatelessOperation(): StatelessOperation;
}
interface StatefulOperationHandler {
GetStatefulOperation(): React.ElementType;
}

我想处理满足OperationHandlerStatelessOperationHandlerStatefulOperationHandler的值。如果满足StatelessOperationHandler,则调用GetStatelessOperation();如果满足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
}

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

你不能在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
}

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

最新更新