我不明白为什么前两份打印输出有效,而后两份却产生错误。
const index1 = "name";
const holder: { field: string; } = { field: "name" };
const index2 = holder.field;
const target = { name: "beep" } as MyType;
console.log(target["name"]);
console.log(target[index1]);
console.log(target[holder.field]);
console.log(target[index2]);
错误说:
TS7053:元素隐式具有“任意”类型,因为类型“string”的表达式不能用于索引类型“MyType”。
在类型“MyType”上未找到具有类型“string”参数的索引签名。
如何通过来自非常量变量名获取字段?
我还没有找到能以我所认识的方式解决这个特定问题的好答案。最令人困惑的是,在这两种情况下,我都使用字符串来获取对象中的字段。唯一的区别是声明const
。
我已尝试as const
按照示例进行添加,但没有任何区别。
字段值来自这个接口。它肯定是一个字符串。在上面的示例中,我甚至简化了类型定义。
export interface SortInfo {
field: string;
direction: number;
}
我尝试从中获取字段的对象本身由该接口声明。
export interface MyType {
id: string;
name: string;
type: number;
...
}
TypeScript 告诉我们它不能确定您使用的键对于该对象是否有效。
就像
target["foobar"]
无法编译一样,target[key]
如果 的类型为key
,那么 也无法编译string
。您需要的密钥类型是
keyof typeof target
,或者在您的情况下keyof MyType
是"id" | "name" | "type" | ...
您可以定义
holder
为{ field: keyof MyType; }
:如果确实应该如此
SortInfo
,那么您可以使用当然,如果
MyType
可以是不同的东西,你会使用泛型: