【发布时间】:2020-09-23 18:36:58
【问题描述】:
我有一个函数可以返回 3 种可能类型中的 1 种:
getFoo(): Observable<Foo> | Promise<Foo> | Foo {
//return 1 of 3 types
}
那么如何确保调用后的确切类型:
const foo = someClassObj.getFoo();
如果我现在想从 foo 获取数据,我怎么知道它是 Observable、Promise 还是类实例 Foo?当我尝试 instanceof 或 typeof 时,它们只检测到“对象”。
【问题讨论】:
-
您可以只测试方法,
.then和.subscribe,参见例如stackoverflow.com/q/27746304/3001761。但重写它以使其更加一致可能更容易。 -
rxjs 导出一个您可以使用的方法
isObservable()。要检查它是否是一个承诺,请参考这个答案stackoverflow.com/a/27746373/6513723 -
"instanceof 或 typeof,它们只检测 'object'" 这些是 runtime 构造,它们对您的编译时静态类型一无所知,您也不能在编译时访问运行时值。
-
@JaredSmith 这一定是 TypeScript 的限制,因为大多数类型安全语言都有在运行时检查对象的类类型的方法。我假设这是因为 TypeScript 是 JS 的超集
-
@u84six 首先,如果您所说的类型安全是指“健全”,那么存在的“类型安全”语言很少,而且它们都没有在生产中广泛使用。至于静态类型语言,它们中的许多通常不会在运行时保留所有甚至任何类型信息:类型会被编译掉。即便如此,另一方面,编译器无法像您建议的那样知道您的值的运行时类型。
标签: javascript angular typescript