TypeScript学习笔记一:环境变量(译)

环境(Ambients)

  环境声明为已经存在的js代码提供静态类型。它与常规声明不同的是它不生成js代码。环境声明为已经存在环境和导入程序外部的实体提供类型信息,而不引入新的变量、方法、类、枚举或命名空间。例如用”<script/>"标签引用的js库。

环境声明

  环境声明以”declare”关键字标注,可以声明变量、方法、类、枚举、命名空间和模块。

  AmbientDeclaration:
    declare   AmbientVariableDeclaration
    declare   AmbientFunctionDeclaration
    declare   AmbientClassDeclaration
    declare   AmbientEnumDeclaration
    declare   AmbientNamespaceDeclaration

  环境声明:

    declare 环境变量声明

    declare 环境函数声明

    declare 环境类声明

    declare 环境枚举声明

    declare 环境命名空间声明

环境变量声明

  环境变量声明向包含的声明空间中引入一个变量。 

  AmbientVariableDeclaration:
    var   AmbientBindingList   ;
    let   AmbientBindingList   ;
    const   AmbientBindingList   ;

  AmbientBindingList:
    AmbientBinding
    AmbientBindingList   ,   AmbientBinding

  AmbientBinding:
    BindingIdentifier   TypeAnnotationopt

  环境变量声明:

    var 环境绑定列表;

    let  环境绑定列表;

    const 环境绑定列表;

  环境绑定列表:

    环境绑定

    环境绑定列表,环境绑定

  环境绑定:

    绑定标识符 类型注释(可选)

 

  环境变量声明可选地包含一个类型注释。如果无类型注释表示,变量将被假设为any类型。

  环境变量声明不允许初始化表达式。

环境函数声明

  环境函数声明向包含的声明空间中引入一个函数。

  AmbientFunctionDeclaration:
    function   BindingIdentifier   CallSignature   ;

  环境函数声明:

    function 绑定标识符 调用签名;

 

  我们可以指定多个相同命名的环境函数声明来重载环境函数。当不能多次重载,也不能只是返回类型不同。

  环境函数声明不能指定函数体,也不允许默认参数值。

环境类声明

  环境类声明在包含的声明空间声明一个类类型和构造函数。

  AmbientClassDeclaration:
    class   BindingIdentifier   TypeParametersopt   ClassHeritage   {   AmbientClassBody   }

  AmbientClassBody:
    AmbientClassBodyElementsopt

  AmbientClassBodyElements:
    AmbientClassBodyElement
    AmbientClassBodyElements   AmbientClassBodyElement

  AmbientClassBodyElement:
    AmbientConstructorDeclaration
    AmbientPropertyMemberDeclaration
    IndexSignature

  AmbientConstructorDeclaration:
    constructor   (   ParameterListopt   )   ;

  AmbientPropertyMemberDeclaration:
    AccessibilityModifieropt   staticopt   PropertyName   TypeAnnotationopt   ;
    AccessibilityModifieropt   staticopt   PropertyName   CallSignature   ;

   环境类声明:

    class 绑定标识符 类型参数(可选) 类继承{环境类体}

  环境类体:

    环境类体元素列表(可选)

  环境类体元素列表:

    环境类体元素

    环境类体元素列表 环境类体元素

  环境类体元素:

    环境构造器声明

    环境属性成员声明

    索引签名

  环境构造器声明:

    构造器(参数列表(可选));

  环境属性成员声明:

    可访问性修饰符(可选) static(可选)属性名 类型注释(可选);

    可访问性修饰符(可选) static(可选)属性名 调用签名;

环境枚举声明

  环境枚举声明与非环境枚举声明的语法相同。

  AmbientEnumDeclaration:
    EnumDeclaration

  环境枚举声明:

    枚举声明

  二者除以下两方面外,其他方面的处理方式相同:

  •   前者,所有格的枚举成员声明都必须以常量枚举表达式方式指定值。
  •   前者,没指定“const”修饰符时,枚举类型声明的默认值是计算成员(相对于自动增值)。

环境命名空间声明

  环境命名空间声明声明一个命名空间

  

  AmbientNamespaceDeclaration:
    namespace   IdentifierPath   {   AmbientNamespaceBody   }

  AmbientNamespaceBody:
    AmbientNamespaceElementsopt

  AmbientNamespaceElements:
    AmbientNamespaceElement
    AmbientNamespaceElements   AmbientNamespaceElement

  AmbientNamespaceElement:
    exportopt   AmbientVariableDeclaration
    exportopt   AmbientLexicalDeclaration
    exportopt   AmbientFunctionDeclaration
    exportopt   AmbientClassDeclaration
    exportopt   InterfaceDeclaration
    exportopt   AmbientEnumDeclaration
    exportopt   AmbientNamespaceDeclaration
    exportopt   ImportAliasDeclaration

  环境命名空间声明:

    命名空间 标识符地址{环境命名空间体}

  环境命名空间体:

    环境命名空间元素列表(可选)

  环境命名空间元素列表:

    环境命名空间元素

    环境命名空间元素列表 环境命名空间元素

  环境命名空间元素:

    export(可选)环境变量声明

    export(可选)环境词汇声明

    export(可选)环境方法声明

    export(可选)环境类声明

    export(可选)接口声明

    export(可选)环境枚举声明

    export(可选)环境命名空间声明

    export(可选)导入别名声明

 

  除了导入别名声明外,环境命名空间元素通常声明导入的实体,无论是否包含可选的“export"修饰符。

环境模块声明

  环境模块声明声明一个模块。只允许在源文件的顶层声明并作用于全局命名空间。标识符必须指定一个顶级模块名,不允许相对模块名。

  AmbientModuleDeclaration:
    declare   module   StringLiteral   {    DeclarationModule   }

  环境模块声明:

    declare module 字符串值{模块声明}

 

  其中的导入声明只能通过顶级模块名来引用其他模块,不允许相对模块名。

  如果此声明包括导出赋值表达式,!!!!!!!!!!!!!,如果此声明不包含导出赋值表达式,那么无论是否包含“export”修饰符,模块中声明的实体都将被导出。环境模块是"开放性“的,同名的环境模块声明作用于同一模块。例如,下面的两个不同资源文件中的"io"模块声明:

declare module "io" {
    export function readFile(filename: string): string;
}
declare module "io" {
    export function writeFile(filename: string, data: string): void;
}

  等同于下面的组合声明:

declare module "io" {
    export function readFile(filename: string): string;
    export function writeFile(filename: string, data: string): void;
} 
posted @ 2016-01-11 19:21  leeberg  阅读(399)  评论(0)    收藏  举报