我一直在尝试将JavaScript网页表单转换为Typescript,并且无法解决如何处理以下问题(适用于JavaScript):
let fieldValues = JSON.parse(cookieData);
let keys = Object.keys(fieldValues);
let values = Object.values(fieldValues);
Visual Studio告诉我:
错误TS2339属性'值'在类型上不存在 ' ObjectConstructor'
我该怎么办?
答案 0 :(得分:8)
Object.values(..)
未稳定,因此在许多浏览器中都不支持https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values)
改为使用map
:
let values = Object.keys(fieldValues).map(key => fieldValues[key]);
如果您真的想使用此功能,则需要在
"es2017.object"
上添加tsconfig.json
lib。确保您使用的是polyfill,或者您的最终平台是否支持此功能。
答案 1 :(得分:6)
如果不支持Object.values
(which today is often the case),则keys
只能map
:
let cookieData = '{"key":"value"}'
let fieldValues = JSON.parse(cookieData)
let keys = Object.keys(fieldValues)
let values = keys.map(k => fieldValues[k])
console.log(keys) //=> ['key']
console.log(values) //=> ['value']

答案 2 :(得分:2)
如果您需要特定键的值,则可以使用以下方法进行访问:
Object(nameofobj)["nameofthekey"]
答案 3 :(得分:1)
作为替代方案。您也可以使用Object.getOwnPropertyNames()
let obj = {...};
Object.getOwnPropertyNames(obj).forEach(key => {
let value = obj[key];
});
答案 4 :(得分:0)
好吧,任何重新放置都可以在我的设置中工作,所以我尝试了以下方法:
let formattedData = {}
for (let index = 0; index < values.length; index++) {
eval("formattedData[indexToChar(index)] = values[index]");
}
基本上可以使用,因为js可以理解,但是ts不能,所以如果我使用 eval ,ts不会尝试解析和抛出错误,因此js会正确读取并正确执行。 评估文档:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/eval
答案 5 :(得分:0)
如果你在谷歌上搜索这个并想知道如何为类型做到这一点:
const VARIANTS_BY_ID = {
100: 'diagonal',
120: 'knight',
125: 'king',
200: 'disjointGroups',
300: 'consecutive',
} as const;
// type Variants = "diagonal" | "knight" | "king" | "disjointGroups" | "consecutive"
type Variants = (typeof VARIANTS_BY_ID)[keyof typeof VARIANTS_BY_ID];