以下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];
答案 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];