TypeScript声明合并详解一
基本概念
当 TypeScript 编译器遇到多个同名的声明时,它会尝试将这些声明合并成一个单一的声明。这使得我们可以分散地定义类型,最终合并成一个完整的定义。
主要的合并类型
1. 接口合并(Interface Merging)
最常见的合并类型,同名接口会自动合并:
interface User {name: string;
}interface User {age: number;
}// 合并后的结果:
// interface User {
// name: string;
// age: number;
// }const user: User = {name: "Alice",age: 25
};非函数成员:如果存在同名非函数成员,它们的类型必须相同,否则会报错。
interface Person {name: string;
}interface Person {name: string; // 正确,类型相同// name: number; // 错误,类型不同
}函数成员:同名函数成员会被视为函数重载:
interface Methods {greet(name: string): string;
}interface Methods {greet(age: number): string;
}// 合并后:
// interface Methods {
// greet(name: string): string;
// greet(age: number): string;
// }2. 命名空间合并(Namespace Merging)
同名命名空间也会合并:
namespace Validation {export interface StringValidator {isAcceptable(s: string): boolean;}
}namespace Validation {export const lettersRegexp = /^[A-Za-z]+$/;export class LettersOnlyValidator implements StringValidator {isAcceptable(s: string) {return lettersRegexp.test(s);}}
}// 可以这样使用:
const validator = new Validation.LettersOnlyValidator();