给团队做次TypeScript分享(八)—— 命名空间

144 阅读1分钟

命名空间

使用 namespace 创建一个命名空间

命名空间内,只有 export 的才可以被命名空间外部访问

namespace myNamespace{
    const name = 'jack'
    
    export interface IUser{
        name: string,
        age: number,
    }

    export function showName(){
        console.log(name)
    }
}

let user: myNamespace.IUser = {
    name: 'mike',
    age: 18
}

console.log(myNamespace.name) // error
myNamespace.showName() // jack

命名空间的合并

和接口类似,同名的命名空间也会合并成员

对于同名的命名空间,模块导出的同名接口也会进行合并

namespace myNamespace{
    export const age = 8
    export interface User {
        name: string
    }
}

namespace myNamespace{
    export class Animal{}
    export interface User {
        age: number
    }
}

// 等同于
namespace myNamespace{
    export const age = 8
    export class Animal{}
    export interface User {
        name: string
        name: string
    }
}

非导出成员在命名空间中只能在其原始命名空间中使用

namespace myNamespace{
    const data = 11
    export function showData(){
        console.log(data)
    }
}

namespace myNamespace{
    export function showOtherData(){
        console.log(data) // error, 找不到名称data
    }
}

导出的才可以

namespace myNamespace{
    export const data = 11
    export function showData(){
        console.log(data)
    }
}

namespace myNamespace{
    export function showOtherData(){
        console.log(data) // ok
    }
}

别名

使用import q = x.y.z给常用的对象起一个短的名字。例如

namespace myNamespace{
    export const name = 'jack'
}

import myName = myNamespace.name // 注意,这里没有require
console.log(myName) // jack

import只会生成与原始符号不同的引用,并不会影响原始变量的值

可能会觉得上面用var, let,const 不也可以吗

确实,但是遇到类型就不行了

namespace myNamespace{
    export const name = 'jack'
    export interface User{
        name: string,
        age:number
    }
}

let myName = myNamespace.name // ok
let myUser = myNamespace.User // error
import myIUser = myNamespace.User // ok