编译器会把多个地方具有相同声明合并为一个声明
    接口之间可以重复定义,在命名空间不可以

    1. interface A {
    2. x: number;
    3. y: number;
    4. // y: string;
    5. foo (bar: number): number //5
    6. foo (bar: 'a'): number // 2
    7. }
    8. interface A {
    9. y: number;
    10. foo (bar: string): string; // 3
    11. foo (bar: number[]): number[] // 4
    12. foo (bar: 'b'): number // 1
    13. }
    14. let e: A = {
    15. x: 1,
    16. y: 1,
    17. foo(bar: any) {
    18. return bar
    19. }
    20. }
    21. // 命名空间和函数的声明合并
    22. function Lib() {}
    23. namespace Lib {
    24. export let version = '1.0'
    25. }
    26. console.log(Lib.version)
    27. // 命名空间和类的声明合并
    28. class F {}
    29. namespace F {
    30. export let state = 1
    31. }
    32. console.log(F.state)
    33. // 命名空间和枚举的声明合并
    34. enum Color {
    35. Red,
    36. Yellow,
    37. Blue
    38. }
    39. namespace Color {
    40. export function mix() {}
    41. }
    42. console.log(Color)
    43. // 函数、类和命名空间的声明合并,必须是命名空间的声明需在后,但是枚举和命名空间的声明合并无此要求