0
点赞
收藏
分享

微信扫一扫

Typescript中声明合并


声明合并

一个标识符可以表示一个值、也可以表示一个类型或者一个命名空间。对于同一个标识符而言,它可以同时表示多个含义。如果同一声明空间内使用的标识符必须唯一。如果同一声明空间内存在同名的声明时,编译器会尝试将所有同名的声明合并为一个声明。如果无法进行声明合并,就会产生编译错误。合并的会按照值对值、类型对类型,命名空间对命名空间的方法合并。

const zss = 5;
interface People {
name: 'test',
age: 22
}
namespace Tea {}

在同一声明空间内声明多个同名接口会合并成一个接口声明,若待合并的接口中存在同名的属性签名类型成员,那么这些同名的属性签名必须是相同的类型,否则会因为合并冲突而编译错误。如果待合并的接口存在同名的方法签名类型成员,那么同名的方法签名类型成员会被视为函数重载,并且靠后定义的方法签名具有更高的优先级,除非重载签名的参数类型中包含字面量类型,则重载签名具有更高的优先级。如果待合并的接口中存在多个调用签名类型成员或构造签名类型成员,那么它们就会被视为函数重载和构造函数重载。优先级判断和合并方法签名类型成员相同。如果待合并的接口中存在多个字符串索引签名或数值索引签名,就会产生编译错误。如果待合并的是泛型接口,那么所有同名接口必须有完全相同的类型参数列表。如果是继承的接口,那么接口会合并为单一的父接口。

interface X {
[prop: string]: string;
}
interface X {
[prop: number]: string;
}
interface People {
[prop: string]: string;
[prop: number]: string;
}

枚举声明合并

合并枚举声明时,只允许其中一个枚举声明的首个枚举成员省略初始值,多个同名的枚举声明会合并成一个枚举声明。多个同名的枚举声明必须同时为​​const​​枚举或者非const枚举,不能混合使用。

enum X {
Y
}
enum X {
U = 6,
}
enum X {
R = 7,
}
let o: X;
o = X.Y;
o = X.U;
o = X.R;

其余

外部类声明可以和接口声明进行合并,但是不支持合并同名的类声明。命名空间中同名的命名空间也会进行合并。如果存在嵌套的命名空间,那么合并外层命名空间时,同名的内层命名空间也会进行合并。在合并命名空间声明时,非导出成员不会被合并。同名的命名空间声明和枚举声明可以进行合并,也可以和类声明进行合并,但是类声明必须位于命名空间声明之前。也可以与函数声明进行合并,但是函数声明也需要位于命名空间之前。但是枚举成员名与命名空间导出成员名不允许出现同名情况,否则会报编译错误。

class People {
inner: People.Inner = new People.Inner();
}
namespace People {
export class Inner {}
}
举报

相关推荐

0 条评论