[英]Typescript Module Import Object Literals
编辑:我对这个问题的第一次迭代过于简化,导致我只允许导入整个对象,但不能访问任何属性。 我已经更新了这个以更准确地展示我的问题。 我还添加了我将在实际程序中使用的实际异步/等待。
我还在 json 中引入了错误来模拟我正在使用的容易出错的数据,以及一个 try/catch 块来跳过错误迭代,尽管这不应该改变我所期望的功能。
我想将 JSON 数据导入一个打字稿模块,执行一些操作,返回一个带有结果的对象文字,然后将该对象文字导入另一个文件以进行进一步的操作,并使用点表示法引用它,但是我只能访问导入后的对象 - 每次访问属性的尝试都以“未定义”结尾
我已经尽可能简化了操作以隔离问题,但找不到:
JSON数据:
{
"THINGS":[
{
"name":"thing1",
"color":"blue"
},
{
"name":"thing2",
"color":"red"
},
{
"name":"thing3",
"color":"orange"
},
{
"name":"thing4",
"color":"purple"
},
{
"error": "error",
"error2": "error"
}
]
}
测试导入 JSON:
import rawdata from './rawdata.json' assert { type: "json" };
export async function test(){
const data = rawdata.THINGS.map(async(Data)=>{
let name = Data.name;
let color = Data.color;
let obj = {
"name": name,
"color": color
}
return obj
});
return(data)
};
// pass it to another function and do some stuff to it:
async function testImport(){
let d = await test();
let q = d.map((e) => {
let p = (d.name + " wuz here")
return p
});
console.log(q)
}
testImport();
/*
returns:
[
'undefined wuz here',
'undefined wuz here',
'undefined wuz here',
'undefined wuz here',
'undefined wuz here'
]
*/
我不敢相信我在这么简单的过程中遇到了这么多麻烦,所以我不得不在 StackOverflow 上提问,因为我显然错过了模块和对象的一些关键基础知识。
这一行:
const data = rawdata.THINGS.map(async (Data) => {
创建一个 Promise 对象数组。 要解决该数组中的所有承诺,您需要使用:
return Promise.all(data)
现在,该函数返回一个解析为对象数组的单个 Promise,而不是每个解析为单个对象的 Promise 数组。
第二个问题在这里:
let d = await test();
let q = d.map((e) => {
let p = (d.name + " wuz here")
return p
});
在map
回调中,您访问d.name
但d
是数组,而不是项目。 您选择将每个项目分配给e
但不在函数中使用该变量。 如果将其更改为e.name
,它将按预期工作:
["thing1 wuz here", "thing2 wuz here", "thing3 wuz here", "thing4 wuz here"]
这就是为什么,即使对于人为的示例代码,单字母变量名也不受欢迎。
如果您的代码是这样的:
let items = await test()
let mappedItems = items.map(item => {
let description = items.name + " wuz here"
})
然后更容易告诉items.name
正在访问数组上的name
属性,这没有多大意义。
请参阅此处的工作示例。 只需展开右下角的“控制台”,您就会看到正确的输出。
这一行:
const data = rawdata.THINGS.forEach((Data)=>{
将始终将data
保留为undefined
。 这是因为array.forEach()
返回undefined
。 所以我不确定你为什么认为这是返回值。
您可能想要使用array.map()
返回一个填充了返回值的新数组。
export function test() {
const data = rawdata.THINGS.map((Data) => {
let name = Data.name;
let color = Data.color;
let info = {
name: name,
color: color
};
return info;
});
return data;
}
有关工作示例,请参阅此代码框:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.