当前位置:   article > 正文

TypeScript系列教程十《模块》_typescript模块

typescript模块

ES Modules 2015加入JS标准,2020年大部浏览器和js运行时都支持了。

这篇文章主要介绍CommonJS和ES Modules ,Module的声明放到后面声明里学习。

JavaScript 模块是怎么定义的

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级importexport的文件都被视为一个模块。

相反,没有任何顶级导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也适用于模块)。

模块在其自身范围内执行,而不是在全局范围内执行。这意味着模块中声明的变量、函数、类等在模块外不可见,除非使用其中一种导出形式显式导出它们。相反,要使用从不同模块导出的变量、函数、类、接口等,必须使用其中一种导入表单进行导入。

非模块

在开始之前,了解TypeScript认为模块是什么很重要。JavaScript规范声明,任何没有导出或顶级等待的JavaScript文件都应该被视为脚本,而不是模块。

脚本文件中,变量和类型被声明为在共享全局范围内,并且假设您将使用–outFile编译器选项将多个输入文件连接到一个输出文件中,或者在HTML中使用多个

如果您的文件当前没有任何导入或导出,但希望将其视为模块,请添加以下行:

export {};

这会将文件更改为不导出任何内容的模块。无论您的模块目标是什么,此语法都有效。

TypeScript 中的模块

在TypeScript编写基于模块的代码时,需要考虑三个主要问题:

  • 语法: 我想使用什么语法来导入和导出内容?

  • 模块解析: 模块名称(或路径)与磁盘上的文件之间的关系是什么?

  • 模块输出目标: 我发出的JavaScript模块应该是什么样子?

ES Module 语法

文件可以通过export default声明主导出:

// @filename: hello.ts

export default function helloWorld() {

console.log(“Hello, world!”);

}

然后通过以下方式导入:

import hello from “./hello.js”;

hello();

除了默认导出外,您还可以通过导出进行多个变量和函数的导出,方法是省略默认值:

// @filename: maths.ts

export var pi = 3.14;

export let squareTwo = 1.41;

export const phi = 1.61;

export class RandomNumberGenerator {}

export function absolute(num: number) {

if (num < 0) return num * -1;

return num;

}

可以通过导入语法在另一个文件中使用:

import { pi, phi, absolute } from “./maths.js”;

console.log(pi);

const absPhi = absolute(phi);

//const absPhi: number

附加导入语法

可以使用类似import{old as new}的格式重命名导入:

import { pi as π } from “./maths.js”;

console.log(π);

//(alias) var π: number

//import π

您可以将上述语法混合并匹配到单个导入中:

// @filename: maths.ts

export const pi = 3.14;

export default class RandomNumberGenerator {}

// @filename: app.ts

import RNGen, { pi as π } from “./maths.js”;

RNGen;

//(alias) class RNGen

//import RNGen

console.log(π);

//(alias) const π: 3.14

//import π

您可以使用*作为名称,获取所有导出的对象并将它们放入单个命名空间中:

// @filename: app.ts

import * as math from “./maths.js”;

console.log(math.pi);

const positivePhi = math.absolute(math.phi);

const positivePhi: number

您可以通过导入“/file”导入文件,而不将任何变量包含到当前模块中:

// @filename: app.ts

import “./maths.js”;

console.log(“3.14”);

在本例中,导入不执行任何操作。然而,Math.ts中的所有代码都经过了评估,这可能会引发影响其他对象的副作用。

TypeScript 中特殊的ES Module语法

可以使用与JavaScript值相同的语法导出和导入类型:

// @filename: animal.ts

export type Cat = { breed: string; yearOfBirth: number };

export interface Dog {

breeds: string[];

yearOfBirth: number;

}

// @filename: app.ts

import { Cat, Dog } from “./animal.js”;

type Animals = Cat | Dog;

TypeScript使用import type扩展了导入语法,该导入类型是只能导入类型的导入。

// @filename: animal.ts

export type Cat = { breed: string; yearOfBirth: number };

‘createCatName’ cannot be used as a value because it was imported using ‘import type’.

export type Dog = { breeds: string[]; yearOfBirth: number };

export const createCatName = () => “fluffy”;

// @filename: valid.ts

import type { Cat, Dog } from “./animal.js”;

export type Animals = Cat | Dog;

// @filename: app.ts

import type { createCatName } from “./animal.js”;

const name = createCatName();

此语法允许像Babel、swc或esbuild这样的非类型脚本传输程序知道哪些导入可以安全删除。

具有CommonJS行为的ES模块语法

TypeScript具有ES模块语法,该语法直接与CommonJS和AMD请求相关。在大多数情况下,使用ES模块的导入与来自这些环境的需求相同,但此语法确保您的TypeScript文件与CommonJS输出具有1对1的匹配:

import fs = require(“fs”);

const code = fs.readFileSync(“hello.ts”, “utf8”);

CommonJS 语法

CommonJS是npm上大多数模块的交付格式。即使您正在使用上面的ES模块语法进行编写,简单了解CommonJS语法的工作原理也将帮助您更轻松地进行调试。

Exporting

标识符是通过在名为module的全局上设置exports属性导出的。

function absolute(num: number) {

if (num < 0) return num * -1;

return num;

}

module.exports = {

pi: 3.14,

squareTwo: 1.41,

phi: 1.61,

absolute,

};

然后可以通过require语句导入这些文件:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

[外链图片转存中…(img-4WglNEhS-1711724662305)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

资料领取方式:戳这里前往获取

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号