无法将javascript转换为typescript,是否出现错误?

p8h8hvxi  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(128)

我写了一个javascript函数。然后我把它转换成typescript。当我转换我得到3个错误。我不能做这个修复。请任何人帮助我。

const countryData = [
    {
        id: 1,
        name: 'Afghanistan',
        isoAlpha2: 'AF',
        isoAlpha3: 'AFG',
        isoNumeric: 4,
        currency: {
            code: 'AFN',
            name: 'Afghani',
            symbol: '؋'
        },
        flag: "flasg",
        callingCodes: ['+93'],
        languages: ['pus'],
        emoji: '🇦🇫'
    },
    {
        id: 2,
        name: 'Albania',
        isoAlpha2: 'AL',
        isoAlpha3: 'ALB',
        isoNumeric: 8,
        currency: {
            code: 'ALL',
            name: 'Lek',
            symbol: 'L'
        },
        flag: "flasg",
        callingCodes: ['+355'],
        languages: ['sqi'],
        emoji: '🇦🇱'
    }
]

export interface CountryDataTypes {
    id: number;
    name: string;
    isoAlpha2: string;
    isoAlpha3: string;
    isoNumeric: number;
    currency: {
        code: string;
        name: string;
        symbol: string | boolean;
    }
    flag: string;
    callingCodes: string[];
    languages: string[];
    emoji: string;
}
interface Props {
    name?: string;
    countryCode?: string;
    callingCode?: string;
    currencyName?: string;
    currencyCode?: string;
    currencySymbol?: string;
    isoNumeric?: number;
}

export function lookup(data: Props): CountryDataTypes {
    const fields = Object.entries(data)
    const result = countryData.find((d) => { // Error 1
        for (var key in fields) {
            return d[fields[key][0]] === fields[key][1] //Error 2
        }
    })
    return result as CountryDataTypes || {} as CountryDataTypes;
}

这里是实时链接-点击这里
这里我写了一个过滤国家数据的函数。它在javascript中工作的很好。但是当我把它转换成typescript时,它给了我错误。
//其他-错误1-
并非所有代码路径都返回值。
错误2-
元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“{ id:编号;名称:字符串; isoAlpha 2:字符串; isoAlpha 3:字符串; isoNumeric:号码;货币:{ code:字符串;名称:字符串;符号:字符串;};标志:字符串;呼叫代码:字符串[];语言:字符串[];表情符号:字符串;}“。
未在类型“{ id:编号;名称:字符串; isoAlpha 2:字符串; isoAlpha 3:字符串; isoNumeric:号码;货币:{ code:字符串;名称:字符串;符号:字符串;};标志:字符串;呼叫代码:字符串[];语言:字符串[];表情符号:字符串;}“。

5tmbdcev

5tmbdcev1#

错误1是因为fields可能是空的,因此for循环将永远不会循环,因此您的箭头函数将永远不会返回任何东西。只需在for循环后添加一个return语句,以返回一些默认值或抛出一个错误。
错误2是因为fields[key][0]的类型是string,你不能使用任意的string值来索引d,但是只有字符串匹配d的属性名之一。如果你确定fields[key][0]d的有效属性名,你可以进行强制转换来告诉编译器:d[fields[key][0] as keyof(typeof d)]。(但我不认为在您的场景中是这种情况,我怀疑您在这里有逻辑错误)。
for循环可以简化为:

for (const [key, value] of fields) {
            return d[key as keyof(typeof d)] === value;
        }

逻辑上key应该是'name' | 'countryCode' | 'callingCode' | 'currencyName' | 'currencyCode' | 'currencySymbol' | 'isoNumeric'。使用这些值来索引d没有多大意义,因为只有named上可用。因此key的类型不是keyof(typeof d),我们在对编译器撒谎。

相关问题