类型别名

类型别名是指,用 type 给一个类型起一个新名字

  1. type Name = string
  2. type NameResolver = () => string
  3. type NameOrResolver = Name | NameResolver
  4. function getName(n: NameOrResolver): Name {
  5. return n === 'string' ? n : n()
  6. }

字符串字面量类型

使用 type 定义一个字符串字面量类型 EventNames,它只能取三种字符串中的一种。

  1. type EventNames = 'click' | 'scroll' | 'mousemove'
  2. function handleEvent(ele: Element, event: EventNames) {
  3. //
  4. }
  5. // OK
  6. handleEvent(document.getElementById('hello'), 'scroll');
  7. // Error event 不能为 'dbclick'
  8. handleEvent(document.getElementById('world'), 'dbclick');

内置对象

内置对象是指在全局作用域上存在的对象

ECMAScript 内置对象

Boolean、Error、Date、RegExp 等。可以在ts中将变量定义为这些类型,更多内置对象 内置对象 - MDN

  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]/;

DOM和BOM的内置对象

Document、HTMLElement、Event、NodeList 等。

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

ts核心库的定义文件

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

比如 Math.pow函数

  1. Math.pow(10, '2'); // Error
  2. // 内部处理
  3. interface Math {
  4. /**
  5. * Returns the value of a base expression taken to a specified power.
  6. * @param x The base value of the expression.
  7. * @param y The exponent value of the expression.
  8. */
  9. pow(x: number, y: number): number;
  10. }

再比如 addEventListener

  1. document.addEventListener('click', function(e) {
  2. console.log(e.targetCurrent);
  3. // Error: Property 'targetCurrent' does not exist on type 'MouseEvent'.
  4. });
  5. // 内部处理
  6. interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent {
  7. addEventListener(type: string, listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
  8. }

ts 核心库的定义中不包含 Node.js 部分

Node.js 不是内置对象的一部分, 如果用ts写node,需要引入第三方声明文件

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