将Array.find与自定义类型一起使用时发生类型错误

时间:2019-05-29 17:12:17

标签: typescript

我有一个包含支持的语言列表的对象。我想找到包含以下一种语言的用户浏览器:

const userLanguage = browserLanguages.find(language => !!supported[language]);

但是,出现以下错误:Element implicitly has an 'any' type because type 'LanguageName' has no index signature.

LanguageName是我为supported对象创建的一种类型:

type LanguageName = {
  [language in SupportedLanguages]: string;
};

supportedLanguages是一种包含我们应用程序支持的所有语言的类型:

type SupportedLanguages = 'en' | 'es';

DEMO

1 个答案:

答案 0 :(得分:2)

我认为您可以通过显式调用overload of Array.find()来获得最佳效果,该user-defined type guard将回调视为infer type guards from function return values。请注意,您必须通过手动注释来完成;编译器当前未Link to code

有多种方法可以做到这一点;这是一个:

// make an explicit type guard for SupportedLanguages    
function supportedLanguageGuard<T extends keyof any>(
  x: T
): x is T & SupportedLanguages {
  return !!(supported as any)[x];
}

// use it
const userLanguage: SupportedLanguages | undefined = browserLanguages.find(
  supportedLanguageGuard
); // okay

之所以这样,是因为无论您缩小browserLanguages来跟踪其中的文字,它都应该起作用

const browserLanguages = ["fr", "es"] as const; // TS3.4+

好的,希望能有所帮助。祝你好运!

{{3}}