typescript - TypeScript - 具有满足一个接口和其他两个接口之一的值
问题描述
给定接口:
interface OperationHandler {
IsCreatedByEvent(event: KeyboardEvent): boolean;
}
interface StatelessOperationHandler {
GetStatelessOperation(): StatelessOperation;
}
interface StatefulOperationHandler {
GetStatefulOperation(): React.ElementType;
}
我想处理满足OperationHandler
and 或StatelessOperationHandler
or的值StatefulOperationHandler
。GetStatelessOperation()
如果值满足则调用,如果满足则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
}
我一直在尝试各种交集和联合类型的东西,但不太确定如何做到这一点。你会使用什么样的语法或模式来做到这一点?
解决方案
您不能在 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
}
根据您的用例,您可以创建包含接口类型的对象的包装类,或者将数据完全存储在基于类的对象中。
推荐阅读
- sql - 现有 hbase 表的 Phoenix 视图有效,但 Phoenix 表无效
- java - Java:如何检查 Java 中的可观察列表以确保它在完成操作之前至少包含一个值?
- c++ - 邻接表图的显示和添加方法
- python - 使用jsonify时烧瓶json到geojson格式不正确
- python - 如何将加密的 BYTES 转换为 BITS Python?
- macos - 为什么我的 dtruss 跟踪中没有任何 execve 调用?
- javascript - Node.js unittest Stubbing 自己的函数
- python - 在 Python 中绘制趋势图
- python - 没有名为 zope.index 的模块
- ruby-on-rails - 验证 ActiveRecord 模型具有相同的关联/组