如何在Typescript中访问使用接口声明的属性的属性?

时间:2014-07-17 05:50:39

标签: typescript

我正在尝试这段代码:

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现在只有两个属性,但稍后可能会有任意数量的不同属性。

2 个答案:

答案 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;你的代码给你:

  • 在消费点为IEnumElement键入安全性
  • 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);