在 TypeScript 中,有没有一种方法可以检查字符串是否包含在联合类型中?

8

Consider the following code:

type Foo = "Foo" | "Bar" | "Baz"

function isInFoo(str: string) boolean {
    // return Foo.contains(str); ?
}

在typescript中,是否有一种优雅的方式来检查str是否属于类型Foo

1
这个问题及其答案可能会有所帮助:https://dev59.com/wVwX5IYBdhLWcg3wySB1 - Alex Knauth
我的回答在这里 https://dev59.com/z1oV5IYBdhLWcg3wAqvy#66820587 - abitcode
2个回答

3

类型注释会从编译代码中删除,在运行时不可用。但是,为了更好地理解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');
}

1
我在这里添加了一个更深入的答案:https://dev59.com/z1oV5IYBdhLWcg3wAqvy#61129291 - jtschoonhoven
2
isFooBar将返回false,因为string in fooBar将根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in#examples返回false。 - Clanket
1
@Clanket 在这里是正确的,in 运算符检查键的存在性,而不是值。因此,0 in fooBar1 in fooBar2 in fooBar 将返回 true,但如果 typeof string === 'string'true,则 string in fooBar 总是返回 false - nathanhleung

1

type Foo 不会被编译成生成的javascript代码。这无法以优雅的方式实现。作为一种选项:使用包含指定字符串的数组,或通过枚举访问这些字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接