1 基础数据类型

  1. let isDone: boolean = false;
  2. let createdByBoolean: boolean = Boolean(1);
  3. let createdByNewBoolean: Boolean = new Boolean(1);
  4. let decLiteral: number = 6;
  5. let myName: string = 'Tom';
  6. function alertName(): void {
  7. alert('My name is Tom');
  8. }
  9. let unusable: void = undefined;
  10. let u: undefined = undefined;
  11. let n: null = null;

2 任意值

在任意值上访问任何属性都是允许的,也允许调用任何方法

  1. let anyThing: any = 'seven';
  2. console.log(anyThing.myName);
  3. anyThing.setName('Jerry');
  4. // 在声明的时候,未指定其类型,那么它会被识别为任意值类型
  5. let something;
  6. something = 'seven';
  7. something = 7;

3 联合类型

  1. let myFavoriteNumber: string | number;
  2. myFavoriteNumber = 'seven';
  3. myFavoriteNumber = 7;
  4. // 只能访问此联合类型的所有类型里共有的属性或方法。
  5. myFavoriteNumber.toString()
  1. // 联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型
  2. let myFavoriteNumber: string | number;
  3. myFavoriteNumber = 'seven';
  4. console.log(myFavoriteNumber.length); // 5,推断为字符串
  5. myFavoriteNumber = 7;
  6. console.log(myFavoriteNumber.length); // 编译时报错,推断为数字,所以报错了

4 对象

  1. interface Person {
  2. readonly id: number; // 只读属性
  3. name: string;
  4. age?: number; // 可选属性
  5. [propName: string]: any; // 任意属性
  6. }
  7. let hh: Person = {
  8. id: 100,
  9. name: 'life',
  10. // age: 300,
  11. // sex: 'male',
  12. }
  13. hh.id = 101; // 报错,只读属性,不能赋值

5 数组

  1. // 使用「类型 + 方括号」来表示数组
  2. let fibonacci: number[] = [1, 1, 2, 3, 5];
  3. // 使用数组泛型 Array<elemType> 来表示数组
  4. let fibonacci: Array<number> = [1, 1, 2, 3, 5];
  5. // 使用接口表示数组
  6. interface NumberArray {
  7. [index: number]: number;
  8. }
  9. let fibonacci: NumberArray = [1, 1, 2, 3, 5];
  10. // 类数组(Array-like Object)不是数组类型,比如 arguments
  11. function sum() {
  12. let args1: {
  13. [index: number]: number;
  14. length: number;
  15. callee: Function;
  16. } = arguments;
  17. let args2: IArguments = arguments;
  18. }
  19. // 用 any 表示数组中允许出现任意类型
  20. let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];

6 函数

6.1 基础使用

  1. function sum(x: number, y: number): number {
  2. return x + y;
  3. }
  4. // 等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的
  5. let mySum = function (x: number, y: number): number {
  6. return x + y;
  7. };
  8. // 手动给 mySum 添加类型
  9. let mySum: (x: number, y: number) => number
  10. = function (x: number, y: number): number {
  11. return x + y;
  12. };
  13. // 用接口定义函数的形状
  14. interface ISearchFunc {
  15. (source: string, subString: string): boolean;
  16. cllTimes: number;
  17. }
  18. function SearchFunc(source: string, subString: string): boolean {
  19. SearchFunc.cllTimes++;
  20. return source.search(subString) !== -1;
  21. }
  22. SearchFunc.cllTimes = 0
  23. let mySearch: ISearchFunc = SearchFunc;

6.2 可选参数、默认值、剩余参数

  1. // 可选参数
  2. function sum(x: number, y?: number): number {
  3. if(y) { return x + y; }
  4. else { return x; }
  5. }
  6. // 默认值
  7. function sum(x: number, y: number=10): number {}
  8. // 剩余参数
  9. function push(array: any[], ...items: any[]) {}

6.3 重载

重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。

  1. function reverse(x: number): number;
  2. function reverse(x: string): string;
  3. function reverse(x: number | string): number | string {
  4. if (typeof x === 'number') {
  5. return Number(x.toString().split('').reverse().join(''));
  6. } else if (typeof x === 'string') {
  7. return x.split('').reverse().join('');
  8. }
  9. }

7 类型断言

类型断言(Type Assertion)可以用来手动指定一个值的类型。

  1. // 方式1 <类型>值
  2. let a = (<any>window).a
  3. // 方式2 值 as 类型
  4. // 在 tsx 语法(React 的 jsx 语法的 ts 版)中必须用方式2。
  5. let b = (window as any).a
  1. function getLength(something: string | number): number {
  2. if ((<string>something).length) {
  3. return (<string>something).length;
  4. } else {
  5. return something.toString().length;
  6. }
  7. }

8 声明文件

当使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能。
https://ts.xcatliu.com/basics/declaration-files

  1. // jQuery.d.ts
  2. declare function jQuery(selector: string): any;
  3. declare function jQuery(domReadyCallback: () => any): any;
  4. declare namespace jQuery {
  5. function ajax(url: string, settings?: any): void;
  6. const version: number;
  7. class Event {
  8. blur(eventType: EventType): void
  9. }
  10. enum EventType {
  11. CustomClick
  12. }
  13. }
  14. // index.ts
  15. jQuery('#foo');
  16. jQuery(function () {
  17. alert('Dom Ready!');
  18. });
  19. jQuery.ajax('/api/get_something');

9 内置对象

JavaScript 中有很多内置对象,它们可以直接在 TypeScript 中当做定义好了的类型。
内置对象是指根据标准在全局作用域(Global)上存在的对象。这里的标准是指 ECMAScript 和其他环境(比如 DOM)的标准。

9.1 ECMAScript的内置对象

更多的内置对象,可以查看 MDN 的文档
他们的定义文件,则在 TypeScript 核心库的定义文件中。

  1. let b: Boolean = new Boolean(1);
  2. let e: Error = new Error('Error occurred');
  3. let d: Date = new Date();
  4. let r: RegExp = /[a-z]/;

9.2 DOM、BOM的内置对象

它们的定义文件同样在 TypeScript 核心库的定义文件中。

  1. let body: HTMLElement = document.body;
  2. let allDiv: NodeList = document.querySelectorAll('div');
  3. document.addEventListener('click', function(e: MouseEvent) {
  4. // Do something
  5. });

9.3 TypeScript 核心库的定义文件

TypeScript 核心库的定义文件中定义了所有浏览器环境需要用到的类型,并且是预置在 TypeScript 中的。
当你在使用一些常用的方法的时候,TypeScript 实际上已经帮你做了很多类型判断的工作了。

9.4 如何用来写Node.js

TypeScript 核心库的定义中不包含 Node.js 部分。
Node.js 不是内置对象的一部分,如果想用 TypeScript 写 Node.js,则需要引入第三方声明文件:

  1. $ npm install @types/node --save-dev