我在TypeScript中有两种类型:
type PublicMethods = 'Time' | 'Assets' | 'AssetPairs' ;
type PrivateMethods = 'Balance' | 'TradeBalance';
我希望使用相同的api
函数来处理这些类型,但每种类型的行为都不同。
public api = (method: PublicMethods | PrivateMethods, params: any) => {
// ...how do I create a type guard here?
if(method instanceof PublicMethods) { // 😱 Doesn't like this!
// ...
}
}
我也尝试过重载这个函数,如下所示:
public api(method: PublicMethods | PrivateMethods, params: any, callback: Function);
public api(method: PublicMethods, params: any, callback: Function) {
// ...implementation
}
public api(method: PrivateMethods, params: any, callback: Function) {
// ...implementation
}
我也不喜欢。有什么建议吗?
3条答案
按热度按时间whhtz7ly1#
您可以像这样创建类型保护:
然后在API集成函数中使用它:
警告!小心,因为如果
PublicMethod
类型被更新而类型保护没有被更新,TS将不会抛出。要更好地处理此问题,请使用以下方法:
ngynwnxp2#
如果基于常数数组定义类型:
现在你可以将名称
PublicMethods
用作类型和变量,变量分别表示字符串和数组的并集,这样你就可以使用类型 predicate 创建一个用户定义的类型保护:这允许您通过检查
PublicMethods
(数组)是否包含value
,将值范围缩小到PublicMethods
(类型):Playground
xoefb8l83#
请注意,typescript类型在运行时不可用,因此
不起作用,因为
method
实际上是字符串。因此,一个非常基本的解决方案是
switch
。如果你想区分
PublicMethods
和PrivateMethods
而不用迭代它们,你可以使用枚举: