TypeScript 中的“环境”是啥意思

Posted

技术标签:

【中文标题】TypeScript 中的“环境”是啥意思【英文标题】:What means "ambient" in TypeScriptTypeScript 中的“环境”是什么意思 【发布时间】:2015-01-12 19:38:52 【问题描述】:

我不明白下面句子中的 ambient 是什么意思:

函数实现不能在环境上下文中声明。

我不确定这个词的一般含义,(英语不是我的母语),如果这里有特定含义,我也不明白。

我试图用我的母语理解,但在这种情况下无法理解。这有点像 current context 我会说但它不起作用。

该消息出现是因为我试图declare 一个无法声明的类,只有module 可以。我已经修复了,但还是不明白这里的错误信息的含义。

【问题讨论】:

语言规范中的第 1.1 章。 一个链接会很棒,但是谢谢。 typescriptlang.org/Content/… 链接失效了 (这里)中的“环境模块”章节[typescriptlang.org/docs/handbook/modules.html]是我认为的对应 【参考方案1】:

英文单词

环境:the character and atmosphere of a place.

TypeScript 版本

TypeScript 声明文件的存在是为了告诉编译器它运行的环境。因此这个词环境上下文。您只能在声明上下文中执行 declarations 而不能在 implementations 中执行。

例如如果您在 TypeScript 不知道的原始 JS 文件中声明了一些 awesomeLibrary,则会出现以下错误:

awesomeLibrary = 123; // Error: `awesomeLibrary` is not defined

所以你可以在环境上下文中声明它,现在 TypeScript 就可以了:

declare var awesomeLibrary: any;
awesomeLibrary = 123; // allowed

更多

More on ambient declarations.

【讨论】:

所以简而言之,你不能在 .d.ts 文件中声明除了接口之外的任何东西。 没有。还有其他声明,例如declare var foo:number; 不是接口。但是,当您尝试将 foo 分配给 123 时,您不能执行 declare var foo = 123 ... 这是一个实现。 我明白环境在现实世界中的含义。但是是什么让 TypeScript 中的某些东西成为环境? 在我的情况下,我在 d.ts 中定义接口和类,我的类应该没有实现,但我得到了那个错误,在查看后我意识到我仍然有构造函数每个类的实现。我认为更“开发人员友好的描述”会受到欢迎,例如“定义类不能包含实现,请检查您没有实现任何构造函数或函数”,以及一些解释其工作原理和常见缺陷的链接。跨度> 这甚至不是答案,提供的链接也无济于事。【参考方案2】:

环境仅仅意味着"without implementation"。

环境声明只存在于类型系统中,并在运行时被删除:

// ambient module declaration
declare module "mymod"  /*... */ 

// ambient namespace declaration
declare namespace MyNamespace  /*... */ 

// ambient variable declaration
declare const myVar: string;

例如declare const myVar: string 就像对编译器的承诺:“假设将有一个const myVar 类型在运行时 定义string”(其他情况类似)。

您也可以将环境视为 TS 中的 declare 关键字。所有类型声明,如 interfaces 或 type aliases,都是隐式定义的,因为编译器很清楚,它们对运行时没有影响。

declare type MyType = a: string // is valid
type MyType = a: string // shorter, so just leave "declare" out

“不能在环境上下文中声明函数实现。”

如前所述,环境声明不能包含运行时代码,例如:

declare module "mymod" 
    function foo()  // error: An implementation cannot be declared in ambient contexts.
        console.log("bar")
    

鉴于"mymod" 是一个npm 包,实现代码宁愿在"node_modules/mymod" 下的主.js 文件中,以上类型驻留在单独的.d.ts 文件中。

【讨论】:

到目前为止,我在这个主题上看到的最全面的答案。我现在真的明白了。谢谢!

以上是关于TypeScript 中的“环境”是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

Typescript中的“通用类型'Feature<T>'需要1个类型参数”是啥意思?

TypeScript 中的“keyof typeof”是啥意思?

TypeScript 中的“as const”是啥意思,它的用例是啥?

TypeScript 中的“类型”保留字是啥?

Typescript 中的类中扩展的类型是啥?

/// <reference types="node" /> 是啥意思?