gpt4 book ai didi

typescript - 命名空间vs模块vs typescript 中的打字?

转载 作者:搜寻专家 更新时间:2023-10-30 20:36:47 25 4
gpt4 key购买 nike

有人能用一个例子来解释这些概念之间的区别吗?我真的很困惑,当他们都有同样的目的时,有三个概念有什么用呢?

最佳答案

TL;博士
模块和名称空间是封装的两种方式—将代码分解成有意义的部分。新代码应该使用模块而不是名称空间编写。
声明文件(“类型”)用于描述模块、命名空间、变量、类型声明等,而不包含任何可运行代码。声明文件只是告诉打字稿什么东西存在,以及如何使用这些东西。
为不同的包定义了类型化的主机声明文件。一个名为foo-bar的定义类型包的声明文件将在NPM上发布为@types/foo-bar
命名空间
这些在JavaScript中形成了某种过时的模式。该模式基本上是在iFIE中封装代码,以防止全局范围内的声明冲突。这些东西将“exports”附加到一个对象上,并将它们赋给一个变量,该变量(希望)在全局范围内具有唯一的名称,比如$_或其他。
例如:

namespace foo {
export var x = 10;
export var y = 20;
}

这发出
var foo;
(function (foo) {
foo.x = 10;
foo.y = 20;
})(foo || (foo = {}));

名称空间还有其他有用的属性,比如能够与函数、类或其他名称空间合并。但主要是,它们在过渡期间引入,在这两个过渡阶段,有必要为组织代码的两种主要方式提供服务:在全局范围内提供API表面上的一个众所周知的变量(例如 $_angular)或…
模块
这些同时描述了ecmascript(标准javascript)、commonjs(即node.js)、amd(即require.js)和system.js模块。这里的核心思想是,不只是将变量放入全局范围并希望它们不会冲突,而是每个文件都有自己独特的范围和导出。
在实践中,模块的原始实现(PosijJS、AMD、Stase.js)工作方式相同:将代码包在函数中以获得正确的范围,并将属性粘到对象上。
但是typescript允许您编写代码,就好像您正在使用顶级 export语句编写ecmascript模块一样。基本上,对于typescript,任何顶层 imports或 exports的文件都是一个模块。
作为一个例子,下面是
export var x = 10;
export var y = 20;

转换为以下CommonJS模块:
"use strict";
Object.defineProperty(module.exports, "__esModule", { value: true });
module.exports.x = 10;
module.exports.y = 20;

虽然命名空间有一些有用的用例,但模块已经成为将代码分解成不同块的清晰方法。
打字/打字
“类型”是用于声明文件( .d.ts文件)的包管理器,在 @types成为指定声明文件的指定方式之前(更详细地说)
因此,“类型化”也成为声明文件的一种别名。
如果你正在开始一个新的项目,不要使用打字。在使用NPM进行声明文件时,Type Script生态系统在很大程度上是标准化的。
另外,由于术语的混乱,您可能不应该将声明文件称为“类型”。
话虽如此,我们可以进入以下主题:
声明文件
声明文件( .d.ts文件,也称为定义文件)是描述现有代码的Type Script文件。它们可以使用 .ts标志从 --declaration文件中生成,也可以手工编写来描述现有的JavaScript代码。
声明文件包含它们实际描述的代码的声明。更具体地说,下面的typescript函数:
function foo(x: number, y: number) {
return x * 100 + y;
}

将通过以下声明进行描述:
declare function foo(x: number, y: number): number

如果原始声明是用JavaScript编写的,那么它仍然可以使用一个声明,如上面所示的显式类型来描述。
这很重要,因为绝大多数JavaScript代码最初不是在TypeScript编写的。因此,社区已经聚集在一起,创建了一个名为RealTyelyType的声明文件存储库。
明确类型
这是一个大的Git存储库,在本文写作时描述了超过3000个库。用户可以发送修补程序和新包的请求。
You can take a look at the repo here on GitHub
@types和npm
这就是如何从RealTyelyType中获得声明文件的方法。例如,如果您想要lodash的 .d.ts文件,可以编写
npm install @types/lodash


关于申报文件的网站。
名为 consumption
The Future of Declaration Files
这些关系如何?
不幸的是,这里的想法很微妙。声明文件可以描述TypeScript的一切。这意味着它们可以描述模块的外观,以及名称空间的外观。
因此,声明文件不适用于与模块和命名空间相同的用途。但它们描述了命名空间和模块存在时的类型化脚本,以及如何使用它们。
基本上,如果您需要使用看起来像模块或命名空间的东西,并且它是用JS编写的,那么您需要一个声明文件。
即使它是用typescript编写的,如果它已经编译成 .js,那么您将需要一个相应的 .d.ts文件来使用它。
我还是不明白
希望这有助于解释,但如果没有,请查看
the elaboration of the above blog post
modules section on the TypeScript website
以上资源
TypeScript Deep Dive's section on modules链接到上面的。

关于typescript - 命名空间vs模块vs typescript 中的打字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44493381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com