我们正在使用简单的函数声明,其中函数接受单个对象或某种类型的对象数组。
简单声明是:
interface ISomeInterface {
name: string;
}
class SomeClass {
public names: ISomeInterface[] = [];
public addNames(names: ISomeInterface | ISomeInterface[]): void {
names = (!Array.isArray(names)) ? [names] : names;
this.names = this.names.concat(names);
}
}
但TypeScript抛出“type is not assignable”错误。
有更好的方法吗?显然我们可以有两个独立的函数,但我认为以这种方式处理单个和多个函数是相当不错的。
答案 0 :(得分:10)
答案 1 :(得分:9)
您还可以使用rest参数:
interface ISomeInterface {
name: string;
}
class SomeClass {
public names: ISomeInterface[] = []; // create an instance if applicable.
addNames(...names: ISomeInterface[]): void {
// the names argument will always be an array
this.names = this.names.concat(names);
}
}
你可以这样称呼:
addNames(name1); // just pass one
addNames(name1, name2, name3); // pass more comma separated
addNames(...[name1, name2, name3]); // pass an array.
请注意,我删除了function
关键字,否则,正文块中的this
关键字可能会失去范围,具体取决于是谁调用它。
答案 2 :(得分:2)
打字的官方方式是使用多个功能签名,例如:
addNames(names: ISomeInterface): void;
addNames(names: ISomeInterface[]): void;
addNames(names: any): void {
...
}
中查看更多信息
答案 3 :(得分:0)
我认为这就是你想要的
interface ISomeInterface {
name: string;
}
class SomeClass {
public names: ISomeInterface[];
addNames(names: ISomeInterface | ISomeInterface[]): void {
names = (names instanceof Array) ? names : [names];
this.names = this.names.concat(<ISomeInterface[]>names)
}
}
您想使用instanceOf
,而不是isArray。