如何实现Type Guard检查字符串是否为TranslationLanguage类型?
问题
现有如下TypeScript代码:
const languages = ["en", "de", "ar"] as const; export type TranslationLanguage = (typeof languages)[number];
此时TranslationLanguage的类型为"en" | "de" | "ar",运行正常。现需实现一个类型守卫函数,判断传入的字符串是否属于TranslationLanguage类型,返回布尔值。用户给出的伪代码如下:
function checkAvailableLanguage( language: string ): language is TranslationLanguage { if (language typeof TranslationLanguage){ return true else{ return false } }
请问该如何正确实现这个函数?
实现方案
TypeScript的类型信息在编译阶段会被擦除,运行时无法直接通过类型本身做判断,所以我们要借助原始的languages数组来完成运行时校验。
正确的实现代码如下:
const languages = ["en", "de", "ar"] as const; export type TranslationLanguage = (typeof languages)[number]; function checkAvailableLanguage(language: string): language is TranslationLanguage { // 利用数组includes方法判断字符串是否在允许的语言列表内 return (languages as readonly string[]).includes(language); }
补充说明
- 因为
languages被const断言为只读的字面量数组,直接调用includes会出现类型不兼容的问题,所以需要先将其断言为readonly string[],让TypeScript允许传入string类型的参数进行判断。 - 当该函数返回
true时,TypeScript的类型系统会自动把传入的language变量类型收窄为TranslationLanguage,后续代码里可以安全地将其当作这个类型使用。
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

