我正在尝试这段代码:
export interface IEnumElement {
elem: string;
text: string;
val: number
}
export interface IIndexable<T> {
[index: string]: T;
}
export class AdminBase {
ExamStatusId: IIndexable<IEnumElement> = {
All: {
elem: "",
text: 'Exam Status: All',
val: 0
},
Current: {
elem: "asdf",
text: 'Exam Status: Current',
val: 1
}
}
}
var x = new AdminBase();
var y = x.ExamStatusId.All;
它给我一个错误说:
Error 1 The property 'All' does not exist on value of type
'IIndexable<IEnumElement>'. C:\Protractor\TypeScript1.ts
请注意,ExamStatusId现在只有两个属性,但稍后可能会有任意数量的不同属性。
答案 0 :(得分:1)
这里的重点是,我们声明ExamStatusId
的类型要实现此接口IIndexable<IEnumElement>
ExamStatusId: IIndexable<IEnumElement>
我们还声明,IIndexable<IEnumElement>
具有 string
键和T
类型的元素:
export interface IIndexable<T> {
[index: string]: T;
}
因此,如何访问该成员的唯一方法是通过字符串索引器:
var y = x.ExamStatusId["All"];
答案 1 :(得分:1)
请查看我之前问题的答案...您会发现我的解决方案实际上允许访问All
属性。
Can I define an interface for every property of an object just the one time?
再一次,我将强调TypeScript中依靠类型推断的美感。您不需要明确注释程序中的所有内容,您可以让编译器和语言服务部门付出艰苦的努力。
&#34;类型推断版本&#34;你的代码给你:
ExamStatusId
属性的类型安全性,如果您将其用作IEnumElement All
媒体资源以下是完整示例:
interface IEnumElement {
elem: string;
text: string;
val: number
}
class Exam {
private examStatusSelectId: number;
ExamStatusId = {
All: {
id: this.examStatusSelectId,
elem: '',
text: 'Exam Status: All',
val: 0
},
Current: {
id: this.examStatusSelectId,
elem: '',
text: 'Exam Status: Current',
val: 1
}
}
}
// This function must be passed an IEnumElement
function example(element: IEnumElement) {
}
var exam = new Exam();
// The compiler knows this is good
example(exam.ExamStatusId.All);