TypeScript

之前很早就听说过TypeScript,也看过好几遍文档。但是如果不在实际项目中使用,总是没有实感,看完就忘了。这次新公司的项目就是ts,写的非常开心,确实感觉ts写出来的代码要稳固健壮的多,一切都很可控,非常舒服。

介绍

TypeScript(一下简称TS)是由微软开发的语言,它是 JavaScript(以下简称JS)的超集,它可以编译成纯JS使用。众所周知JS是动态语言,不指定变量类型,可以任意改变。TS就是为JS增加了一套完整的类型和类型检查系统,让代码更可读可控,更健壮,输入输出都更清晰明了。

使用TS十分简单,把JS的文件扩展名直接由.js改为.ts即可。即使代码中没有显示定义类型,也能够自动做出类型推论。另外,TS最终是编译成JS来执行的,编译的过程中,TS会执行类型检查,如果有错误会提示出来方便开发者修改,但是即便报错,也仍然会编译出JS供执行。

参考资料

推荐首先阅读 TypeScript 入门教程 ,阅读顺序比较友好。

常见用法

安装之类的就不说了,直接上代码看用法。

原始数据类型

// 对于原始数据类型
const x: boolean = false; // boolean, 注意 new Boolean(0) 生成的对象不是布尔值
const x: number = 6; // 数字
const x: string = 'fsdf'; // 字符串
const x: undefined = undefined; // undefined
const x: null = null; // null

// js没有空值 void 的改变,在ts中,可以用 void 表示没有任何返回值的函数
function alertName(): void {
    alert('My name is Tom');
}

任意值

// 任意值 any, 不限定类型。但在实际开发中慎用,写了相当于不是ts了
let x: any = 6;
x = 'fdsfs';

类型推论

// 如果没有显式指定类型,ts也会自行推论,然后报错
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

联合类型

// 联合类型,允许某个值有多个可能的类型
let x: string | number;  // 只能是 string 或者 number,否则会报错
x = 'seven';
x = 7;
// 这里需要注意,当使用联合类型时,我们只能访问 所有类型 共有 的属性或方法。
// 比如 x.toString()是两者共有的,就没问题
// 而 x.length 只有string有,number没有,就会报错。

对象的类型 – 接口 interface

TS中使用接口(interface)来定义对象的类型。简单来说就是,它用来描述对象的 形状。

一般来说,interface 使用 I + 大驼峰 来命名,方便区分。

// 比如
interface IPerson = {
	readonly id: number; // 只在 对象被创建 的时候被赋值,用readonly定义只读属性
	name: string; // 姓名,字符串类型
	age: number; // 年龄, 数字类型
	hasMoney?: boolean; // 是否有钱, 布尔值 可选参数
	childern?: IPerson[]; // 孩子, 对象数组,对象仍然是IPerson的形状, 可选参数
	// 任意属性,来设定 key 和 value 的类型
	// 但因为上边已经有 number string boolean IPerson[]这几个类型
	// 所以这里的任意属性,起码要包含上述这几种类型,不然就自相矛盾了
	// 故这里可以使用联合类型
	[propName: string]: string | number | boolean | IPerson[]; 
	// 也可以直接使用any
	[propName: string]: any;
}

数组的类型

// 「类型 + 方括号」表示法
const x = string[]; // 字符串数组
// 泛型表示
const x: Array<number> = [1, 1, 2, 3, 5];
// 用 interface 表示
interface NumberArray {
    [index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
// any 数组
const list: any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];

// 类数组: 相似但不是数组类型,常见的都有自己的接口定义,比如
IArguments
NodeList
HTMLCollection

函数的类型

// 括号内写明每个参数的类型
// 括号外表示 返回值 的类型,没有返回值则为 void
function sum(x: number, y: number): number {
    return x + y;
}

// 带 ? 问号 的是可选参数,可选参数 必须在 必选参数 的后面。
// ES6 中允许给参数默认值,TS会将添加了默认值的参数视为可选参数
// 但此时,就不受 「可选参数得在必选参数后边」 的限制了。
function sum(x: number, y: number = 0): number {
    return x + y;
}

类型断言

todo…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章