从前打心眼儿里讨厌编译成JavaScript的这类语言,像Coffee,Dart等。但是在15年春节前后却爱上了TypeScript。同时非常喜欢的框架Dojo,Angularjs也宣布使用TypeScript做新版本的开发。那么TypeScript究竟为何物?又有什么魅力呢?TypeScript是Microsoft公司注册商标。TypeScript具有类型系统,且是JavaScript的超集。它可以编译成普通的JavaScript代码。
本章节使用的是 TypeScript 来创建 Angular 的应用,这也是官方推荐使用的,本教程的实例也将采用 TypeScript 来编写。
消息摘要算法通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。消息摘要算法也被称为哈希(Hash)算法或散列算法。任何消息经过散列函数处理后,都会获得唯一的散列值,这一过程称为 “消息摘要”,其散列值称为 “数字指纹”,其算法自然就是 “消息摘要算法”了。换句话说,如果其数字指纹一致,就说明其消息是一致的。
首先,强类型不允许随意的隐式类型转换,而弱类型是允许的。JavaScript就是经典的弱类型语言。而Typescript可以说是JavaScript的超集,在JS的基础上新增了许多语法特性,使得类型不再可以随意转换,能大大减少开发阶段的错误。
下面列出了一些在使用TypeScript语言和编译器过程中常见的容易让人感到困惑的错误信息。令人困惑的常见错误"tsc.exe" exited with error code 1修复:检查文件编码,确保为UTF-8 - https://typescript.codeplex.com/workitem/1587external module XYZ cannot be resolved修复:检查模块路径是否大小写敏感 - https://typescript.codeplex.
介绍在JavaScript里(还有TypeScript),this关键字的行为与其它语言相比大为不同。这可能会很令人吃惊,特别是对于那些使用其它语言的用户,他们凭借其直觉来想象this关键字的行为。这篇文章会教你怎么识别及调试TypeScript里的this问题,并且提供了一些解决方案和各自的利弊。典型症状和危险系数丢失this上下文的典型症状包括:类的某字段(this.
选项类型默认值描述--allowJsbooleantrue允许编译javascript文件。--allowSyntheticDefaultImportsboolean(module === "system")允许从没有设置默认导出的模块中默认导入。这并不影响代码的显示,仅为了类型检查。--allowUnreachableCodebooleanfalse不报告执行不到的代码错误。--allowUnusedLabelsbooleanfalse不报告未使用的标签错误。
概述如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项。一个项目可以通过以下方式之一来编译:使用tsconfig.json不带任何输入文件的情况下调用tsc,编译器会从当前目录开始去查找tsconfig.json文件,逐级向上搜索父目录。
除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码。你可能在Scala等语言里对mixins及其特性已经很熟悉了,但它在JavaScript中也是很流行的。混入示例下面的代码演示了如何在TypeScript里使用混入。后面我们还会解释这段代码是怎么工作的。// Disposable Mixinclass Disposable { isDisposed: boolean;
随着TypeScript和ES6里引入了类,现在在一些场景下我们会需要额外的特性,用来支持标注或修改类及其成员。Decorators提供了一种在类的声明和成员上使用元编程语法添加标注的方式。Javascript里的Decorators目前处在建议征集的第一阶段,在TypeScript里做为实验性特性已经提供了支持。注意 Decorators是实验性的特性,在未来的版本中可能会发生改变。
JSX是一种嵌入式的类似XML的语法。它可以被转换成合法的JavaScript,尽管转换的语义是依据不同的实现而定的。JSX因React框架而流行,但是也被其它应用所使用。TypeScript支持内嵌,类型检查和将JSX直接编译为JavaScript。基本用法想要使用JSX必须做两件事:给文件一个.tsx扩展名启用jsx选项TypeScript具有两种JSX模式:preserve和react。
当使用外部JavaScript库或新的宿主API时,你需要一个声明文件(.d.ts)定义程序库的shape。这个手册包含了写.d.ts文件的高级概念,并带有一些例子,告诉你怎么去写一个声明文件。指导与说明流程最好从程序库的文档而不是代码开始写.d.ts文件。这样保证不会被具体实现所干扰,而且相比于JS代码更易读。下面的例子会假设你正在参照文档写声明文件。
TypeScript中有些独特的概念可以在类型层面上描述JavaScript对象的模型。这其中尤其独特的一个例子是“声明合并”的概念。理解了这个概念,将有助于操作现有的JavaScript代码。同时,也会有助于理解更多高级抽象的概念。对本文件来讲,“声明合并”是指编译器将针对同一个名字的两个独立声明合并为单一声明。合并后的声明同时拥有原先两个声明的特性。
这篇文章将概括介绍在TypeScript里使用模块与命名空间来组织代码的方法。我们也会谈及命名空间和模块的高级使用场景,和在使用它们的过程中常见的陷井。查看模块章节了解关于模块的更多信息。查看命名空间章节了解关于命名空间的更多信息。使用命名空间命名空间是位于全局命名空间下的一个普通的带有名字的JavaScript对象。这令命名空间十分容易使用。
这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码。就像我们在术语说明里提到的那样,“内部模块”现在叫做“命名空间”。另外,任何使用module关键字来声明一个内部模块的地方都应该使用namespace关键字来替换。这就避免了让新的使用者被相似的名称所迷惑。第一步我们先来写一段程序并将在整篇文章中都使用这个例子。
从ECMAScript 2015开始,JavaScript引入了模块的概念。TypeScript也沿用这个概念。模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用export形式之一导出它们。相反,如果想使用其它模块导出的变量,函数,类,接口等的时候,你必须要导入它们,可以使用import形式之一。
当一个对象实现了属性时,我们认为它是可迭代的。一些内置的类型如Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自的Symbol.iterator。对象上的Symbol.iterator函数负责返回供迭代的值。for..of 语句for..of会遍历可迭代的对象,调用对象上的Symbol.iterator方法。下面是在数组上使用for..of的简单例子:let someArray = [1, "string", false];
自ECMAScript 2015起,symbol成为了一种新的原生类型,就像number和string一样。symbol类型的值是通过Symbol构造函数创建的。let sym1 = Symbol();let sym2 = Symbol("key"); // 可选的字符串keySymbols是不可改变且唯一的。let sym2 = Symbol("key");let sym3 = Symbol("key");sym2 === sym3;
TypeScript里的类型兼容性是基于结构子类型的。结构类型是一种只使用其成员来描述类型的方式。它正好与名义(nominal)类型形成对比。(译者注:在基于名义类型的类型系统中,数据类型的兼容性或等价性是通过明确的声明和/或类型的名称来决定的。这与结构性类型系统不同,它是基于类型的组成结构,且不要求明确地声明。
这节介绍TypeScript里的类型推论。即,类型是在哪里如何被推断的。基础TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型。如下面的例子let x = 3;变量x的类型被推断为数字。这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时。大多数情况下,类型推论是直截了当地。后面的小节,我们会浏览类型推论时的细微差别。
关注时代Java