Javascript 如何在map()中声明此变量的类型
以下是所讨论的功能:Javascript 如何在map()中声明此变量的类型,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,以下是所讨论的功能: const getCountryLangCode = (countryCode: string) => { const filtered = Object.entries(config.languages) .map(([key, language]) => { if (language.code.split('-')[1] === countryCode) { return language.code
const getCountryLangCode = (countryCode: string) => {
const filtered = Object.entries(config.languages)
.map(([key, language]) => {
if (language.code.split('-')[1] === countryCode) {
return language.code
}
})
.filter(item => item)
const langCode = filtered[0]
return langCode
}
问题是map()函数中的“language”是type=unknown,当我尝试构建我的React应用程序时,由于该类型对象的类型为“unknown”,它无法构建。TS2571
我已经尝试了我能想到的每一个版本的输入语法,将“any”类型提供给“language”,但我做得不对
声明语言应该是type==any的正确方法是什么?要回答您的问题,请将type放在
对象上
。。。
const filtered=Object.entries(config.languages)
.map([key,language])=>{
...
请参见
条目之前(和之后)的条目
。这样,您将在传入的条目
参数上放置特定类型,在您的示例中是配置语言
向上声明类型
如果可以,您总是希望声明链中较高的类型。您要求“在map()
中声明此变量的类型”但是您需要声明config
变量的类型。在config.languages
对象上拥有正确的类型将允许Typescript自己推断对象的类型。条目
、.map()
和.filter()
config
是一个对象
带有属性语言
。该语言
属性是一个对象
,其中每个值都是一个对象
带有属性代码
,该属性是一个字符串
。当我们有一个所有值都是相同类型的对象时,我们使用类型脚本
interface MyConfig {
languages: Record<string, {code: string}>
}
如果config
具有类型MyConfig
,则find()
回调中的变量languages
将自动获取类型{code:string}
,因为Typescript知道config.languages
对象的值类型
我们之所以使用,是因为find
不能保证找到匹配项,因此match
可能是undefined
。我们的函数返回string | undefined
为什么要在.map()
中“过滤”数组,然后再次使用.filter()
来修复.map()
的错误用法?您想要的是数组.prototype.find()
而不是.map().filter()[0]
constructThank@Andreas-我试图调试的是其他人的代码。我也没有很好地理解它,正是因为map的使用对于预期的结果来说过于复杂。下面的答案解决了这个问题,但最终我意识到,当我们想要的只是一个简单的函数时,整个函数太复杂了从已知键中删除值。
const match = Object.values(config.languages).find(
language => language.code.split('-')[1] === countryCode
);
return match?.code;