1.原始类型

  1. let num: number;
  2. let str: string;
  3. let bool: boolean;

2.数组

  1. let boolArray: boolean[];
  2. let fibonacci: Array<number> = [1, 1, 2, 3, 5]; //数组泛型

3.接口

  1. interface Name {
  2. first: string;
  3. second: string;
  4. third?: boolean //?:表示可选属性
  5. //任意属性,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
  6. [propName:string]:string|number|boolean
  7. readonly id:number //只读属性,不可被修改
  8. }
  9. //接口和变量的形状、类型必须保持一致
  10. let name: Name;
  11. name = {
  12. first: 'John',
  13. second: 'Doe'
  14. };
  15. name = {
  16. // Error: 'Second is missing'
  17. first: 'John'
  18. };
  19. name = {
  20. // Error: 'Second is the wrong type'
  21. first: 'John',
  22. second: 1337
  23. };

4.内联注解

内联类型能为你快速的提供一个类型注解。它可以帮助你省去为类型起名的麻烦(你可能会使用一个很糟糕的名称)。然而,如果你发现需要多次使用相同的内联注解时,考虑把它重构为一个接口(或者是 type alias)是一个不错的主意。

  1. let name: {
  2. first: string;
  3. second: string;
  4. };

5.特殊类型

1.any 任意类型

2.null 和 undefined

在类型系统中,JavaScript 中的 null 和 undefined 字面量和其他被标注了 any 类型的变量一样,都能被赋值给任意类型的变量,如下例子所示:

  1. let num: number;
  2. let str: string;
  3. // 这些类型能被赋予
  4. num = null;
  5. str = undefined;

3.void 函数无返回值

  1. function log(message: string): void {
  2. console.log(message);
  3. }

6.泛型

  1. //函数 reverse 的返回值类型与它接受的参数的类型一样。当你传入 var sample = [1, 2, 3] 时,
  2. 1.下面的reverse函数接受类型为T的一个数组T[],返回值也为T[]
  3. //TypeScript 能推断出 reverse 为 number[] 类型,从而能给你类型安全。
  4. function reverse<T>(items: T[]): T[] {
  5. const toreturn = [];
  6. for (let i = items.length - 1; i >= 0; i--) {
  7. toreturn.push(items[i]);
  8. }
  9. return toreturn;
  10. }
  11. const sample = [1, 2, 3];
  12. let reversed = reverse(sample);
  13. console.log(reversed); // 3, 2, 1
  14. // Safety
  15. reversed[0] = '1'; // Error
  16. reversed = ['1', '2']; // Error
  17. reversed[0] = 1; // ok
  18. reversed = [1, 2]; // ok

7.联合类型 |

当希望使用多个类型之一时,可以采用联合类型。

  1. function formatCommandline(command: string[] | string) {
  2. let line = '';
  3. if (typeof command === 'string') {
  4. line = command.trim();
  5. } else {
  6. line = command.join(' ').trim();
  7. }
  8. // Do stuff with line: string
  9. }

联合类型的特点:

  1. 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
  2. 联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

    8.交叉类型

    //todo

    9.元组类型

  1. let nameNumber: [string, number];
  2. // Ok
  3. nameNumber = ['Jenny', 221345];
  4. // Error
  5. nameNumber = ['Jenny', '221345'];

10.函数类型

  1. 1.函数声明
  2. function sum(x: number, y: number,z?:string): number {
  3. return x + y;
  4. }
  5. 2.函数表达式
  6. let mySum = function (x: number, y: number): number {
  7. return x + y;
  8. };
  9. 3. ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数:
  10. function buildName(firstName: string, lastName: string = 'Cat') {
  11. return firstName + ' ' + lastName;
  12. }
  13. 4.剩余参数
  14. function push(array: any[], ...items: string[]) {
  15. items.forEach(function(item) {
  16. array.push(item);
  17. });
  18. }

11.类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

  1. let myFavoriteNumber = 'seven';
  2. //等价于
  3. let myFavoriteNumber: string = 'seven';

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

12.类型断言

  1. 1. <类型>值
  2. 2. as 类型
  3. //eg
  4. function getLength(something: string | number): number {
  5. if ((<string>something).length) { //断言为string
  6. return (<string>something).length;
  7. } else {
  8. return something.toString().length;
  9. }
  10. }
  11. tsx 语法(React jsx 语法的 ts 版)中必须用后一种。
  12. 类型断言不是类型转换,断言成一个联合类型中不存在的类型是不允许的:

13.接口和类型别名的区别

  • 如果你需要使用类型注解的层次结构,请使用接口。它能使用 implementsextends
  • 为一个简单的对象类型请使用类型别名 type ,只需要给它一个语义化的名字即可。另外,当你想给联合类型和交叉类型提供一个语义化的名称时,一个类型别名将会是一个好的选择。
  • 接口可以较容易的拓展。 ```javascript // Lib a.d.ts interface Point { x: number, y: number } declare const myPoint: Point

// Lib b.d.ts interface Point { z: number }

// Your code let myPoint.z // Allowed! ```