TypeScript:我可以声明一个接口可能有任何数量的其他属性吗?

时间:2014-07-06 15:15:01

标签: typescript

是否有可能表达“此接口的实例具有一个名为'num'的数字,一个名为'func'的函数,并且在TypeScript中可能具有任何数量的具有未指定名称的属性,类型为字符串”? 我想它可能看起来像这样:

interface MyInterface {
  num: number;
  func: Function;
  *: string;
}

您可能想告诉我这是一个糟糕的API设计,但我正在为第三方库编写定义文件而我无法改变: - (。

4 个答案:

答案 0 :(得分:4)

最接近的语法如下:

interface MyInterface {
    [index: string]: any;
    num: number;
    func: Function;
}

var a: MyInterface = {
    num: 123,
    func: function () {},
    prop1: 'Hello',
    prop2: 'World'
};

类型"任何"必须使用,因为属性" num"和" func"不是字符串:

  

索引签名是一种描述数组的强大方法   '词典'模式,他们还强制所有属性匹配   他们的回归类型。

来源:TS Handbook

答案 1 :(得分:0)

我认为如果您只想要一个不是强类型的对象,您应该将您的类声明为类型"任何"

declare var MyObject:any;

如果您的界面与某些具体内容无关,并且不具备一组结构化的属性和方法,那么为什么要强制它成为一个界面呢?编译好的JS没有多大意义,但它应该为你编译。

答案 2 :(得分:0)

接口是开放的,所以如果你想扩展接口,你可以 - 你的扩展必须在同一个公共根目录中(即,如果你习惯于在命名空间中思考,那么#34;名称空间位置相同):

interface MyInterface {
    num: number;
    func: Function;
}

//...

interface MyInterface {
    additional: string;
    somethingElse: number;
}

当您使用MyInterface时,您会看到所有成员,例如在此位置:

function example(input: MyInterface) {
    input.      
}

您将在自动完成列表中看到num, func, additional, somethingElse

更新

如果您真的想要任意字符串键值(您不会获得自动完成或类型检查),您可以通过键访问它们。所有非任意属性和方法仍将获得自动完成和类型检查:

var x: MyInterface = {
    num: 1,
    func: () => 2
};

x['ArbitraryString'] = 'Arbitrary value';

alert(x['ArbitraryString']);

答案 3 :(得分:0)

您可以使用其他一些答案中提到的数组接口语法:

interface MyInterface {
    [index: string]: any;
    MyString: string;
    someFunc: () => void;
}

var myInstance: MyInterface = {
    MyString: 'Hello',
    someFunc: () => {},
    SomeOtherProp: 'Another'
};

遗憾的是,如果您尝试直接访问其中一个任意属性,则会出现编译器错误:

var y = myInstance.SomeOtherProp;

但是,你可以通过使用没有索引器的接口来解决这个问题:

interface MyInterface {
    MyString: string;
    someFunc: () => void;
}

var myInstance: MyInterface = {
    MyString: 'Hello',
    someFunc: () => {},
    SomeOtherProp: 'Another'
};

然后将您的对象转换为:

var y = (<any>myInstance).SomeOtherProp;

这将为您提供任意属性的智能感知,并编译出您期望的语义JavaScript:

var y = myInstance.SomeOtherProp;

not 允许声明你打算有一个可以添加到你对象的字符串属性的任意列表,但据我所知,没有办法在截至目前的TypeScript。