对象的类型——接口
在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。
什么是接口
在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。
TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。
简单的例子
123456789interface Person { name: string; age: number;}let tom: Person = { name: 'Tom', age: 25};
上面的例子中,我们定义了一个接口
Person,接着定义了一个变量 tom,它的类型是
Person。这样,我们就约束了 tom
的形状必须和接口 Person 一致。
接口一般首字母大写。有的编程语言中会建议接口的名称加上
I 前缀。
定义的变量比接口少了一些属性是不允许的:
12345 ...
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。
简单的例子
123456789let myFavoriteNumber: string | number;myFavoriteNumber = 'seven';myFavoriteNumber = 7;``````let myFavoriteNumber: string | number;myFavoriteNumber = true;// index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.// Type 'boolean' is not assignable to type 'number'.
联合类型使用 | 分隔每个类型。
这里的 let myFavoriteNumber: string | number
的含义是,允许 myFavoriteNumber 的类型是
strin ...
类型推论
如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type
Inference)的规则推断出一个类型。
什么是类型推论
以下代码虽然没有指定类型,但是会在编译的时候报错:
1234let myFavoriteNumber = 'seven';myFavoriteNumber = 7;// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
事实上,它等价于:
1234let myFavoriteNumber: string = 'seven';myFavoriteNumber = 7;// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
TypeScript
会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果 ...
任意值
任意值(Any)用来表示允许赋值为任意类型。
什么是任意值类型
如果是一个普通类型,在赋值过程中改变类型是不被允许的:
1234let myFavoriteNumber: string = 'seven';myFavoriteNumber = 7;// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
但如果是 any 类型,则允许被赋值为任意类型。
12let myFavoriteNumber: any = 'seven';myFavoriteNumber = 7;
任意值的属性和方法
在任意值上访问任何属性都是允许的:
123let anyThing: any = 'hello';console.log(anyThing.myName);console.log(anyThing.myName.firstName);
也允许调用任何方法:
1234let anyTh ...
原始数据类型
JavaScript 的类型分为两种:原始数据类型(Primitive
data types)和对象类型(Object types)。
原始数据类型包括:布尔值、数值、字符串、null、undefined
以及 ES6 中的新类型 Symbol 和
ES10 中的新类型 BigInt。
本节主要介绍前五种原始数据类型在 TypeScript
中的应用。
布尔值
布尔值是最基础的数据类型,在 TypeScript 中,使用 boolean
定义布尔值类型:
1234let isDone: boolean = false;// 编译通过// 后面约定,未强调编译错误的代码片段,默认为编译通过
注意,使用构造函数 Boolean
创造的对象不是布尔值:
1234let createdByNewBoolean: boolean = new Boolean(1);// Type 'Boolean' is not assignable to type 'boolean'.// 'boolean' is a primit ...
Hello TypeScript
我们从一个简单的例子开始。
将以下代码复制到 hello.ts 中:
123456function sayHello(person: string) { return 'Hello, ' + person;}let user = 'Tom';console.log(sayHello(user));
然后执行
1tsc hello.ts
这时候会生成一个编译好的文件 hello.js:
12345function sayHello(person) { return 'Hello, ' + person;}var user = 'Tom';console.log(sayHello(user));
在 TypeScript 中,我们使用 :
指定变量的类型,: 的前后有没有空格都可以。
上述例子中,我们用 : 指定 person 参数类型为
string。但是编译为 js
之后,并没有什么检查的代码被插入进来。
这是因为 ...
安装 TypeScript
TypeScript 的命令行工具安装方法如下:
1npm install -g typescript
以上命令会在全局环境下安装 tsc
命令,安装完成之后,我们就可以在任何地方执行 tsc
命令了。
编译一个 TypeScript 文件很简单:
1tsc hello.ts
我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用
TypeScript 编写 React 时,以 .tsx 为后缀。
编辑器
TypeScript 最大的优势之一便是增强了编辑器和 IDE
的功能,包括代码补全、接口提示、跳转到定义、重构等。
主流的编辑器都支持 TypeScript,这里我推荐使用 Visual Studio Code。
它是一款开源,跨终端的轻量级编辑器,内置了对 TypeScript 的支持。
另外它本身也是用
TypeScript 编写的。
下载安装:https://code.visualstudio.com/
获取其他编辑器或 IDE 对 TypeScript 的支持:
Sublime
Text
WebStorm
Vim
Emacs
...
什么是 TypeScript
Typed JavaScript at Any Scale.
添加了类型系统的 JavaScript,适用于任何规模的项目。
以上描述是官网[1]对于 TypeScript 的定义。
它强调了 TypeScript
的两个最重要的特性——类型系统、适用于任何规模。
TypeScript 的特性
类型系统
从 TypeScript 的名字就可以看出来,「类型」是其最核心的特性。
我们知道,JavaScript 是一门非常灵活的编程语言:
它没有类型约束,一个变量可能初始化时是字符串,过一会儿又被赋值为数字。
由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。
基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改。
函数是 JavaScript 中的一等公民[2],可以赋值给变量,也可以当作参数或返回值。
这种灵活性就像一把双刃剑,一方面使得 JavaScript
蓬勃发展,无所不能,从 2013
年开始就一直蝉联最普遍使用的编程语言排行榜冠军[3];另一方面也使得它的代码质量参差不齐,维护成本高,运行时错误多。
而 TypeScr ...
JavaScript 语言的历史
诞生
JavaScript
因为互联网而生,紧跟着浏览器的出现而问世。回顾它的历史,就要从浏览器的历史讲起。
1990年底,欧洲核能研究组织(CERN)科学家 Tim
Berners-Lee,在全世界最大的电脑网络——互联网的基础上,发明了万维网(World
Wide
Web),从此可以在网上浏览网页文件。最早的网页只能在操作系统的终端里浏览,也就是说只能使用命令行操作,网页都是在字符窗口中显示,这当然非常不方便。
1992年底,美国国家超级电脑应用中心(NCSA)开始开发一个独立的浏览器,叫做
Mosaic。这是人类历史上第一个浏览器,从此网页可以在图形界面的窗口浏览。
1994年10月,NCSA 的一个主要程序员 Marc Andreessen 联合风险投资家 Jim
Clark,成立了 Mosaic 通信公司(Mosaic Communications),不久后改名为
Netscape。这家公司的方向,就是在 Mosaic
的基础上,开发面向普通用户的新一代的浏览器 Netscape Navigator。
1994年12月,Navigator 发 ...
导论
什么是 JavaScript 语言?
JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script
language),指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序(比如浏览器)的“脚本”。
JavaScript
也是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多,只能用来做一些数学和逻辑运算。JavaScript
本身不提供任何与 I/O(输入/输出)相关的
API,都要靠宿主环境(host)提供,所以 JavaScript
只合适嵌入更大型的应用程序环境,去调用宿主环境提供的底层 API。
目前,已经嵌入 JavaScript
的宿主环境有多种,最常见的环境就是浏览器,另外还有服务器环境,也就是
Node 项目。
从语法角度看,JavaScript
语言是一种“对象模型”语言。各种宿主环境通过这个模型,描述自己的功能和操作接口,从而通过
JavaScript 控制这些功能。但是,JavaScript
并不是纯粹的“面向对象语言”,还支持其他编程范式(比如函数式编程)。这导致几乎任何一个问题,JavaScript
都有多 ...
