Consider the following code:
type Foo = "Foo" | "Bar" | "Baz"
function isInFoo(str: string) boolean {
// return Foo.contains(str); ?
}
在typescript中,是否有一种优雅的方式来检查
str
是否属于类型Foo
?Consider the following code:
type Foo = "Foo" | "Bar" | "Baz"
function isInFoo(str: string) boolean {
// return Foo.contains(str); ?
}
str
是否属于类型Foo
?类型注释会从编译代码中删除,在运行时不可用。但是,为了更好地理解Ivan的回答,这里举一个从数组中提取数据的类型化数据的例子:
const fooBar = ['foo', 'bar', 'baz'] as const;
type FooBar = typeof fooBar[number]; // "foo" | "bar" | "baz"
然后您可以编写一个自定义类型保护,以在运行时检查字符串:
function isFooBar(string: unknown): string is FooBar {
return typeof string === 'string' && string in fooBar;
}
并像这样使用:
const maybeFooBar: unknown = 'baz';
if (isFooBar(maybeFooBar)) {
console.log('Typescript knows this is a FooBar');
}
string in fooBar
将根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in#examples返回false。 - Clanketin
运算符检查键的存在性,而不是值。因此,0 in fooBar
、1 in fooBar
和 2 in fooBar
将返回 true
,但如果 typeof string === 'string'
为 true
,则 string in fooBar
总是返回 false
。 - nathanhleungtype Foo 不会被编译成生成的javascript代码。这无法以优雅的方式实现。作为一种选项:使用包含指定字符串的数组,或通过枚举访问这些字段。