TS学习——命名空间、模块、声明文件

命名空间

命名空间一个最明确的目的就是解决重名问题。

命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。

TypeScript 中命名空间使用 namespace 来定义,语法格式如下:

namespace SomeNameSpaceName { 
   export interface ISomeInterfaceName {      }  
   export class SomeClassName {      }  
}

在另一空间调用上述的空间的类(类和接口前加了export关键字才能在外部空间使用),示范如下:

SomeNameSpaceName.SomeClassName;

如果命名空间单独写在一个ts文件中,引用方式(用 /// 引用)如下:

/// <reference path = "SomeFileName.ts" />

IShape.ts

namespace Drawing { 
    export interface IShape { 
        draw(); 
    }
}

Circle.ts

/// <reference path = "IShape.ts" /> 
namespace Drawing { 
    export class Circle implements IShape { 
        public draw() { 
            console.log("Circle is drawn"); 
        }  
    }
}

Triangle.ts

/// <reference path = "IShape.ts" /> 
namespace Drawing { 
    export class Triangle implements IShape { 
        public draw() { 
            console.log("Triangle is drawn"); 
        } 
    } 
}

TestShape.ts

/// <reference path = "IShape.ts" />   
/// <reference path = "Circle.ts" /> 
/// <reference path = "Triangle.ts" />  
function drawAllShapes(shape:Drawing.IShape) { 
    shape.draw(); 
} 
drawAllShapes(new Drawing.Circle());
drawAllShapes(new Drawing.Triangle());

// Circle is drawn
// Triangle is drawn

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

namespace namespace_name1 { 
    export namespace namespace_name2 {
        export class class_name {    } 
    } 
}

模块

TypeScript 模块的设计理念是可以更换的组织代码。

模块导出使用关键字 export 关键字,语法格式如下:

// 文件名 : SomeInterface.ts 
export interface SomeInterface { 
   // 代码部分
}

要在另外一个文件使用该模块就需要使用 import 关键字来导入:

import someInterfaceRef = require("./SomeInterface");

声明文件

TypeScript 作为 JavaScript 的超集,在开发过程中不可避免要引用其他第三方的 JavaScript 的库。虽然通过直接引用可以调用库的类和方法,但是却无法使用TypeScript 诸如类型检查等特性功能。

为了解决这个问题,需要将这些库里的函数和方法体去掉后只保留导出类型声明,而产生了一个描述 JavaScript 库和模块信息的声明文件。通过引用这个声明文件,就可以借用 TypeScript 的各种特性来使用库文件了。

使用 declare 定义的类型只会用于编译时的检查,编译结果中会被删除。

声明文件以 .d.ts 为后缀,声明文件或模块的语法格式如下:

declare module Module_Name {
}

引入声明文件格式如下:

/// <reference path = " runoob.d.ts" />

实例

CalcThirdPartyJsLib.js

var Runoob;  
(function(Runoob) {
    var Calc = (function () { 
        function Calc() { 
        } 
    })
    Calc.prototype.doSum = function (limit) {
        var sum = 0; 
 
        for (var i = 0; i <= limit; i++) { 
            sum = sum + i; 
        }
        return sum; 
    }
    Runoob.Calc = Calc; 
    return Calc; 
})(Runoob || (Runoob = {})); 
var test = new Runoob.Calc();

声明文件Calc.d.ts

declare module Runoob { 
   export class Calc { 
      doSum(limit:number) : number; 
   }
}

CalcTest.ts

/// <reference path = "Calc.d.ts" /> 
var obj = new Runoob.Calc(); 
// obj.doSum("Hello"); // 编译错误,参数是数字类型
console.log(obj.doSum(10));

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeScript 中,当我们导入一个 JavaScript 模块时,因为缺乏类型声明文件(.d.ts),TypeScript 无法了解该模块的类型信息。此时,TypeScript 会隐式将该导入模块的类型标注为 `any`。 将一个变量的类型标注为 `any`,意味着 TypeScript 将对该变量的类型检查放松,允许它接受任何类型的值,且不会对其进行类型检查和类型推断。这通常发生在一些旧的 JavaScript 代码中,或者是一些没有类型声明文件的第三方库。 由于 `any` 类型的变量可以接受任何类型的值,它会绕过 TypeScript 的类型检查。这导致我们无法在编译期间捕获到潜在的类型错误,增加了代码出错的风险。 为了解决找不到模块声明文件隐式拥有 `any` 的问题,我们可以尝试以下几种方法: 1. 安装对应的类型声明文件:如果是使用第三方库,可以通过安装该库的类型声明文件(通常以 "@types/库名" 的形式发布在 npm 上)来解决问题。安装后,TypeScript 将能够正确地推断出导入模块的类型信息,而不再默认为 `any`。 2. 创建自定义的类型声明文件:如果无法找到对应的类型声明文件,或者是自己编写的 JavaScript 代码没有提供类型定义,我们可以手动创建一个类型声明文件(以 .d.ts 结尾),并在文件中使用 `declare module` 来声明模块的类型。通过编写这个声明文件,我们可以告诉 TypeScript 导入模块的类型信息,从而解决隐式 `any` 的问题。 总而言之,当遇到无法找到模块声明文件的情况时,TypeScript 会默认将该模块的类型标注为 `any`,即弱类型。为了避免潜在的类型错误,我们应该尽量安装或编写对应的类型声明文件,来建立起正确的类型推断和类型检查。这样可以提高代码质量,减少错误发生的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值