【发布时间】:2018-10-09 15:53:47
【问题描述】:
我有一个给定联合类型的数组,然后想检查来自联合类型超集的字符串是否包含在数组中(运行时检查):
const validOptions: ("foo" | "bar")[] = ["foo", "bar"]
type IArrType = typeof validOptions[number]
const key: IArrType | "alien" = "alien" // Rather: some random function
const isKeyInArr = validOptions.indexOf(key) > -1 // Error: "alien" is not assignable to "foo" | "bar"
// Fix 1:
const isKeyValidCast = validOptions.indexOf(<IArrType>key) > -1
// Fix 2:
const isKeyValidExplicit =
key === "alien" ? false : validOptions.indexOf(key) > -1 // OK: type guard magic
Fix 1 可以,但不是很优雅。 Fix 2 欺骗了编译器,但运行时具有误导性和低效。在我的情况下,“外星人”字符串类型只是任何不在联合类型中的字符串的占位符。
有没有什么方法可以在没有强制转换或显式测试的情况下编译?可以否定表达式,以便我们让这个“类型保护”工作吗?
顺便说一句:这个非常酷的答案展示了如何从值列表构造一个类型化的元组:Typescript derive union type from tuple/array values
【问题讨论】:
-
可能
(arr as string[]).indexOf(key)是你最好的选择。 -
@jcalz - 是的,我同意投射 arrary 比投射参数更好。代码的意图更清楚。然而,最终使用了自定义保护函数和
find()。
标签: typescript