我有一个包含支持的语言列表的对象。我想找到包含以下一种语言的用户浏览器:
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';
答案 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}}