在typescript中声明for in循环的键类型

9bfwbjaz  于 2023-04-13  发布在  TypeScript
关注(0)|答案(3)|浏览(327)

我有下面的代码

const urlParams = new URLSearchParams(window.location.search);

interface PersonType {
    fname: string
    lname: string
}
const person: PersonType = {fname:"John", lname:"Doe"};

const newObj = {
    newobj: "new value"
}

for(const key in person) {
    urlParams.append(key, newObj[key]); //error
}

https://codesandbox.io/s/vanilla-ts?utm_source=dotnew&file=/src/index.ts:0-500
我应该如何在for in循环中声明的键字符串?

2vuwiymt

2vuwiymt1#

在TypeScript中,for..in只会将被迭代的键输入为 string,而不是被迭代的对象的键。由于key是作为字符串输入的,而不是newobj,因此不能使用newObj[key],因为泛型字符串在类型上不存在。
使用Object.entries,一次提取键和值,而不是尝试单独处理键:

for(const [key, val] of Object.entries(newObj) {
    urlParams.append(key, val);
}
mmvthczy

mmvthczy2#

const urlParams = new URLSearchParams(window.location.search);

interface PersonType {
    fname: string
    lname: string
}
const person: PersonType = {fname:"John", lname:"Doe"};

const newObj = {
    newobj: "new value"
}

for(const key in person) {
    urlParams.append(key, newObj[key as keyof PersonType]); 
}

newObj[key]中添加as keyof PersonType

dw1jzc5e

dw1jzc5e3#

我通常只是用一个显式的类型重新声明键。特别是,如果我经常在循环中使用键。

const urlParams = new URLSearchParams(window.location.search);

interface PersonType {
    fname: string
    lname: string
}
const person: PersonType = {fname:"John", lname:"Doe"};

const newObj = {
    newobj: "new value"
}

for(const keyTemp in person) {
    const key = keyTemp as keyof PersonType; // key redeclared with type
    urlParams.append(key, newObj[key]);
}

相关问题