无法在Typescript中提取对象值

时间:2017-03-31 18:48:35

标签: javascript typescript

我一直在尝试将JavaScript网页表单转换为Typescript,并且无法解决如何处理以下问题(适用于JavaScript):

let fieldValues = JSON.parse(cookieData);

let keys = Object.keys(fieldValues);

let values = Object.values(fieldValues);

Visual Studio告诉我:

  

错误TS2339属性'值'在类型上不存在   ' ObjectConstructor'

我该怎么办?

6 个答案:

答案 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.valueswhich 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];