【TS】TypeScript namespace和module

文章目录

namespace 命名空间

【命名空间嵌套】

【命名空间合并】

【命名空间别名】

module

 【通配符模块声明】


namespace 命名空间

namespace 主要用于解决命名冲突,他会在全局生成一个对象,在 namepace 内部的成员都要通过这个对象访问。使用命名空间可以解决代码和第三方库之间的同名冲突。

若命名空间使用 declare 关键字,则命名空间内部属性不需要再使用 declare 。

如果需要在命名空间外部使用内部成员,则需要添加 export 关键字前缀。

命名空间内部成员的访问使用点号 . 来实现。

// 定义命名空间
namespace Utils {
    export namespace Message {
        const name = 'jack'
        export function getName() {
            console.log(name)
        }
        export interface Validation {
            age: number
        }
    }
}
// 在命名空间外使用成员
Utils.Message.getName(); // jack
console.log(Utils.Message.str); // --报错

【命名空间嵌套】

命名空间支持嵌套,即可以将命名空间定义在另外一个命名空间里头。

namespace Utils {
  // 命名空间嵌套
  export namespace Messaging {
    export function log(msg:string) {
      console.log(msg);
    }
  }
}

Utils.Messaging.log('hello') // "hello"

【命名空间合并】

多个同名的 namespace 会自动合并

namespace Animals {
  export class Cat {}
}
namespace Animals {
  export interface Legged {
    numberOfLegs: number;
  }
  export class Dog {}
}
// 等同于
namespace Animals {
  export interface Legged {
    numberOfLegs: number;
  }
  export class Cat {}
  export class Dog {}
}

命名空间中的非 export 的成员不会被合并,但是它们只能在各自的命名空间中使用。

namespace N {
  const a = 0;
  export function foo() {
    console.log(a);  // 正确
  }
}
namespace N {
  export function bar() {
    foo(); // 正确
    console.log(a);  // 报错
  }
}

【命名空间别名】

命名空间别名是使用 import 关键字定义的。

namespace Utils {
    // 命名空间嵌套
    export namespace Messaging {
        export function log(msg: string) {
            console.log(msg);
        }
    }
}
import Um = Utils.Messaging;
Um.log('haha'); // haha
Utils.Messaging.log('hello'); // hello

module

TS 支持 CommonJS 和 ESM 两种模块系统,使得声明模块有两种写法,分别是使用字符串和变量名 。

CommonJS 的写法遵循匹配文件的相对或绝对路径,通常模块名作为字符串字面量,该方法不支持导出模块,只允许使用 declare 定义全局模块,并且使用时需要使用 import 导入。

// global.d.ts 
declare module "global_type" {
    export type IAnimal = {
        name: string
    }
}
// src/index.ts
import * as global_type from "global_type"
const myObject: global_type.IAnimal = {}

ESM 的写法和定义变量一样,使用变量名匹配标识符进行模块的导入,这种方式与定义命名空间(namespace)的效果一样,使用 ESM 定义的全局模块可以直接使用,不需要导入。

// global.d.ts 
declare module global_type {
    export type IAnimal = {
        name?: string
    }
}
// src/index.ts
const myObject: global_type.IAnimal = {}

 【通配符模块声明】

在 react 内置类型声明文件中可以看到看到下面代码,这种写法是 CommonJS 模块系统独有的。

// react-app.d.ts
declare module '*.png' {
    const src: string;
    export default src;
}
// App.tsx
import logo from './logo.png';

这段代码中使用了 *.png 通配符,声明了一个全局模块,匹配所有 .png 结尾的模块,导入的 .png 类型文件就会声明为 string 类型。

参考:https://blog.csdn.net/time_____/article/details/129443454

TypeScript 教程——阮一峰·著

TypeScript 中文网

TypeScript 官网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01Typescript介绍 、Typescript安装、Typescript开发工具(15分51秒).rar 02 Typescript 中的数据类型 boolean 数字类型 number类型 string类型 array类型元组类型 (tuple)枚举类型 (enum) (上) (20分29秒).rar 03 Typescript中的数据类型 任意类型 (any) null 和 undefined void类型 never类型 (下) (16分6秒).rar 04 Typescript中的函数 函数的定义 可选参数 默认参数 剩余参数 函数重载 箭头函数 (31分50秒).rar 05 Typescript中的类 Es5中的类和静态方法 继承 (原型链继承、对象冒充继承、原型链+对象冒充组合继承) (20分40秒).rar 06 Typescript中的类 类的定义 继承 类里面的修饰符 (上) (29分4秒).rar 07 Typescript中的类 类中的静态属性 静态方法 抽象类 多态 (下) (27分52秒).rar 08 Typescript中的接口的用途 以及属性类型接口 (19分46秒).rar 09 Typescript中的属性类型接口【案例】 定义Ajax请求数据的接口 ts封装ajax (8分).rar 10 Typescript中的函数类型口 【案例】 加密方法约束 (5分11秒).rar 11 Typescript中的可索引接口 类类型接口 (12分2秒).rar 12 Typescript中接口扩展、接口的继承 (7分19秒).rar 13 Typescript中的泛型 泛型变量 泛型类 (22分54秒).rar 14 Typescript的泛型接口 泛型类接口 (8分42秒).rar 15 Typescript泛型类 - 把类作为参数类型的泛型类 (21分47秒).rar 16 Typescript 类型、接口、类 、泛型 综合使用--Typescript封装统一操作Mysql Mongodb Mssql的底层类库 (14分31秒).rar 17 Typescript 模块 以及模块化封装DB库 封装类似Mongoose风格的类库 (25分22秒).rar 18 命名空间 命名空间块化 (11分35秒).rar 19 装饰器定义 类装饰器 属性装饰器 装饰器工厂 (23分17秒).rar 20 装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序 (28分39秒
`declare module` 和 `namespace` 都是 TypeScript 中用来组织代码结构的关键字,但它们的使用场景和作用略有不同。 `declare module` 用于声明一个模块或库的类型定义,例如: ```typescript declare module 'my-library' { export function myFunction(): void; export const myVariable: string; } ``` 这段代码声明了一个名为 `my-library` 的模块,并且声明了该模块中导出的函数和变量的类型。在实际使用中,如果我们要使用这个模块,可以通过 `import` 来引入: ```typescript import { myFunction, myVariable } from 'my-library'; ``` `namespace` 用于声明一个命名空间,可以将相关的代码组织在一起。例如: ```typescript namespace MyNamespace { export function myFunction(): void { // ... } export const myVariable: string = 'Hello'; } ``` 这段代码声明了一个名为 `MyNamespace` 的命名空间,并且在其中声明了一个函数和一个变量。在实际使用中,我们可以通过命名空间来访问这些代码: ```typescript MyNamespace.myFunction(); console.log(MyNamespace.myVariable); ``` 需要注意的是,命名空间可以嵌套,例如: ```typescript namespace OuterNamespace { export namespace InnerNamespace { export function myFunction(): void { // ... } } } ``` 在实际使用中,我们可以通过命名空间来访问嵌套的代码: ```typescript OuterNamespace.InnerNamespace.myFunction(); ``` 总的来说,`declare module` 用于声明模块或库的类型定义,而 `namespace` 用于组织代码。在实际使用中,我们可以根据需要选择适合的关键字来组织我们的代码结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值