如何在TypeScript严格模式下使用方括号表示法访问对象的属性

时间:2019-05-02 19:47:36

标签: typescript

以下TypeScript示例代码在严格模式下的行Element implicitly has an 'any' type because type '{one: number; two: number;}' has no index signature中显示错误const one = obj[prop];

编译器允许使用const two = obj[propName];行,因此我无法理解为什么显示该错误,或​​者一般来说该如何使用方括号表示法访问对象的属性。

const obj = { one: 1, two: 2 };

const props = { one: 'one', two: 'two' };

// it is not possible add or change any properties in the props object 
props.zero = 'zero';
props.one = 1;

// prop has the type string
const prop = props.one;

// using the bracket notation fails with the following error message:
// Element implicitly has an 'any' type because type '{one: number; two: number;}' has no index signature.
// const prop: string
const one = obj[prop];

// this works because propName is of type 'two'
const propName = 'two';
const two = obj[propName];

2 个答案:

答案 0 :(得分:2)

  

元素隐式具有“ any”类型,因为类型为“ {{one:number;二:数字;}'没有索引签名

您的对象没有索引签名,它具有两个命名属性。

  

编译器允许行const two = obj ['two'];

它允许使用属性名称,这就是obj ['two']和obj ['one']可以工作的原因。

  

并且const属性是一个字符串,所以我无法理解为什么显示错误

由于一个字符串可以具有仅“一个”或“两个”更多的值,因此编译器无法确保,因此您的object[myString]调用将起作用。仅对两个定义的字符串值有效。

  

一般来说,如何使用方括号表示法访问对象的属性。

这将起作用:

 const prop: 'one' | 'two' = 'one';
 const test = obj[prop]

您说:prop的值为'one'或'two',因此编译器知道您的obj [prop]将始终有效。

 class Example {
   one: string;
   two: string;
 }
 const prop: keyof Example = 'one';
 const test = obj[prop];

这里keyof(ClassName)告诉编译器,您的prop变量将具有Example的现有属性名称。

以上示例假定您有一个对象,其中只有名为“ one”和“ two”的属性有效。如果要以“字典样式”使用对象,请告诉打字稿并添加索引签名:

 const obj: {[key:string]: string;} = { one: 'one' };
 const text = obj[myString];

现在obj允许将每个字符串值用作键。

答案 1 :(得分:0)

我特别喜欢强壮型,但 const obj: any应该没问题。


interface test { 
    one: string;
    two: string;
}

const props: test = { one: 'one', two: 'two' }; // {one: string, two: string}
const obj: any = {one: 1, two: 2}; // {one: number, two: number}


const two = obj['two']; // number

const prop = props.one; // string

const one = obj[prop];

枚举解决方案

enum numbers {
    one = 1,
    two = 2
}

const oneStr = numbers[numbers.one];
const one = numbers[oneStr];