是否有可能表达“此接口的实例具有一个名为'num'的数字,一个名为'func'的函数,并且在TypeScript中可能具有任何数量的具有未指定名称的属性,类型为字符串”? 我想它可能看起来像这样:
interface MyInterface {
num: number;
func: Function;
*: string;
}
您可能想告诉我这是一个糟糕的API设计,但我正在为第三方库编写定义文件而我无法改变: - (。
答案 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。