繁体   English   中英

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

[英]How can I access a property of a property declared with an interface in 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现在只有两个属性,但是以后可能有许多不同的属性。

这里的要点是,我们声明的类型ExamStatusId要实现此接口IIndexable<IEnumElement>

ExamStatusId: IIndexable<IEnumElement>

我们还声明了IIndexable<IEnumElement>具有string键和类型T元素:

export interface IIndexable<T> {
    [index: string]: T;
} 

因此,这里如何访问该成员的唯一方法是通过字符串索引器:

var y = x.ExamStatusId["All"];

请查看我对上一个问题的回答...您将看到我的解决方案实际上允许访问All属性。

我可以一次为对象的每个属性定义一个接口吗?

再一次,我将强调TypeScript依靠类型推断的美丽。 您不需要显式注释程序中的所有内容,可以让编译器和语言服务来完成这些工作。

代码的“类型推断版本”为您提供:

  • 在使用时为IEnumElement输入安全性
  • 如果您将 ExamStatusId属性用作ExamStatusId ,请ExamStatusId安全性
  • 访问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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM