将字典推入数组错误“无法分配给‘never’类型的参数”

问题描述 投票:0回答:1

我试图最终得到一本字典列表的字典,但我很难向其中添加元素。我拥有的是一个足够简单的 CSV,在 Excel 中看起来就像这样。

上面的内容使用

papa.parse
解析为一个字典数组,标题是字典的键,但我需要以特定的方式格式化它。

我最终需要的是一本字典,其第一个条目:

finalDict = {
    state: "CA",
    governor: {
        first_name: "Gavin",
        last_name: "Newsom"
    },
    cities: [{city1: "LA", population: "8M", mayor: "ABC"},
             {city2: "SF", population: "1M", mayor: "DEF"}]
}

看起来应该很简单,我编写了一个函数,该函数接受一个文件并迭代,但在使用上面的“城市”键时遇到困难:

function parseFile(csv) {
    let stateGovs = {
        state: "",
        governor: {
            first_name:"",
            last_name:""
        },
        cities:[]
    }

    // Note I can write more detail in my for loop upon request, but this is where the issue is
    csv.forEach((entry) => {
        // insert some more parsing logic, but I end up with a temp variable that looks like
        temp = {city1: "LA", population: "8M", mayor: "ABC"}
        // and I say
        stateGovs.cities.push(temp)    
    }
}
 

我在字典中定义城市的方式,智能感知告诉我它的类型是 never[],当我尝试将任何内容推送到它(即我的临时字典)时,我收到警告“argument of type any[]/{ } 不能分配给“never”类型的参数”,这就是我陷入困境的地方。我尝试将我的临时变量设置为一个字典列表,在我的函数之外显式定义一个类型,但问题的关键是这个,并且似乎没有任何效果,因为我不知道(足够)我在这里做错了什么。任何帮助将不胜感激。

reactjs typescript for-loop
1个回答
0
投票

当您初始化空数组时,TypeScript 在

简单情况
中将其隐式推断为 any[](请参阅 ms/TS#18687),或者在其他情况下推断为
never[]
类型(就像您的属性
stateGovs.cities: []
的情况一样) .

因此,它认为您尝试推入该数组的任何内容都是不正确的,因为没有任何内容可以分配给

never

在许多情况下,我们计划稍后填充空数组。只需告诉 TypeScript 数组应该包含什么:

interface City {
    city1: string
    population: string
    mayor: string
}

const cities: City[] = []
const cities2: Array<City> = [] // Alternative syntax
const cities3 = [] as City[] // Type assertion

另请参阅https://www.geeksforgeeks.org/how-to-avoid-inferring-empty-array-in-typescript/

在你的情况下,你可以简单地这样做:

const stateGovs2 = {
    state: "",
    governor: {
        first_name: "",
        last_name: ""
    },
    cities: [] as City[] // Type assertion
}

...现在 TypeScript 可以让您推入符合

City
接口的数组对象:

stateGovs2.cities.push(temp) // Okay
//         ^? City[]

游乐场链接

© www.soinside.com 2019 - 2024. All rights reserved.