命名空间
使用 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