有没有办法检查TypeScript中的Union类型中是否包含字符串?

时间:2016-04-19 22:06:49

标签: typescript

请考虑以下代码:

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

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

在打字稿中,是否有一种优雅的方法来检查str类型Foo是否属于<{1}}?

2 个答案:

答案 0 :(得分:1)

类型 Foo 不会被编译到生成的javascript中。它无法以优雅的方式实现。作为一个选项:使用具有指定字符串的数组,或通过枚举获取这些字段。

答案 1 :(得分:1)

类型注释从已编译的代码中删除,并且在运行时不可用。但是,为了扩展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');
}