let isDone: boolean = false;  let decLiteral: number = 6;  let myName: string = 'tom';1.示例
  let myName: null = null;
  let myName: undefined = undefined;2.null/undefined是所有类型的子类型
  let val: 其它类型 = undefined;1.关键字为void,只能被赋值undefined和null
  let unusable: void = undefined;1.可以赋值为任意类型的值(没有类型限制)
  let myFavoriteNumber: any = 'seven';
  myFavoriteNumber = 7;2.对任意值进行任何操作,返回值类型都是任意值
3.变量声明时,如果未指定类型
  a.未赋值,则会默认为any类型
    let something;
    something = 'seven';
    something = 7;
  b.赋值了,则会被类型推断为所赋值的类型
    let myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;  // 会报错1.表示取值可以为多种类型中的一种
2.示例
  let myFavoriteNumber: string | number
  myFavoriteNumber = 'seven'
  myFavoriteNumber = 73.当不确定联合类型变量的类型时,只能访问此联合类型的所有类型里共有的属性或方法
  function getString(something: string | number): string {
    return something.toString()
  }1.对象的类型由接口定义
2.接口是对行为的抽象,而具体实现则由类去实现
3.示例代码
  interface Person {
    name: string
    age: number
  }
  
  let tom: Person = {
    name: 'Tom',
    age: 25
  }4.对象定义时,变量的属性数量/形状必须和接口属性数量/形状保持一致
5.可选属性
    interface Person {
        name: string
        age?: number
    }
    let tom: Person = {
        name: 'Tom'
    }5.任意属性(一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的子类型)
    interface Person {
        name: string
        age: number
        [propName: string]: any
    }
    let tom: Person = {
        name: 'Tom',
        age: 25 // 会报错
    }6.只读属性
    interface Person {
        readonly id: number
        age: number
    }
    let tom: Person = {
        id: 10,
        age: 25
    }
    tom.id = 89757 // 报错1.类型+方括号表示法
    let arr: number[] = [1, 1, 2, 3, 5];
    let arr: number[] = [1, 1, 2, 3, '5']; // 会报错
    arr.push('5'); // 会报错2.数组泛型
    let fibonacci: Array<number> = [1, 1, 2, 3, 5]3.接口表示数组
    interface NumberArray {
        [index: number]: number
    }
    let fibonacci: NumberArray = [1, 1, 2, 3, 5]4.any数组
    let list: any[] = ['xjh', 25, { key: 'xx' }]5.类数组
    function sum() {
        let args: IArguments = arguments
    }1.函数声明
    function sum(x: number, y: number): number {
                return x + y;
    }    sum(1, 2, 3) // 报错
    sum(1) // 报错2.函数表达式
    let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
        return x + y
    }3.用接口定义函数的形状
    interface SearchFunc {
        (source: string, subString: string): boolean
    }
    let mySearch: SearchFunc = function(source: string, subString: string) {
        return source.search(subString) !== -1
    }4.可选参数
5.参数默认值
6.剩余参数
7.重载
    function reverse(x: number): number
    function reverse(x: string): string
    function reverse(x: number | string): number | string {
        if (typeof x === 'number') {
            return Number(x.toString().split('').reverse().join(''))
        } else if (typeof x === 'string') {
            return x.split('').reverse().join('');
        }
    }    let myFavoriteNumber = 'seven';
    myFavoriteNumber = 7; // 报错,因为已推断为字符串    let myFavoriteNumber;
    myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;1.手动指定一个值的类型
2.方法
3.断言成一个联合类型中不存在的类型是不允许的
    function toBoolean(something: string | number): boolean {
        return <boolean>something
    }    type Name = string;
    type NameResolver = () => string;
    type NameOrResolver = Name | NameResolver;    type EventNames = 'click' | 'scroll' | 'mousemove';
    function handleEvent(ele: Element, event: EventNames) {}    let tom: [string, number] = ['Tom', 25];1.当赋值或访问一个已知索引的元素时,可以只赋值其中一项
    let tom: [string, number];
    tom[0] = 'Tom';2.直接对元祖类型赋值时,需提供所有类型项
    let tom: [string, number];
    tom = ['Tom', 25];3.当添加越界元素时,类型会被限制为定义项的类型
    let tom: [string, number];
    tom = ['Tom', 25];
    tom.push('male');
    tom.push(true); // 报错    enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
    console.log(Days["Sun"] === 0); // true
    console.log(Days[0] === "Sun"); // true    enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
    console.log(Days["Sun"] === 7); // true
    console.log(Days["Mon"] === 1); // true
    console.log(Days["Sat"] === 6); // true1.常数项和计算所得项
2.计算所得项·示例
    enum Color { Red, Green, Blue = "blue".length };3.如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错
    enum Color { Red = "red".length, Green, Blue }; // 报错1.示例代码
    const enum Directions {
        Up,
        Down,
        Left,
        Right
    }
    let directions = [ Directions.Up, Directions.Down, Directions.Left, Directions.Right ];
    var directions = [0, 1, 2, 3]; //编译结果2.常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员
1.示例代码
    declare enum Directions {
        Up,
        Down,
        Left,
        Right
    }
    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
    var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //编译结果2.declare 定义的类型只会用于编译时的检查,编译结果中会被删除
3.外部枚举与声明语句一样,常出现在声明文件中
    public          可被公开访问
    private         仅供自身访问,子类也不可以访问它的属性/方法
    protected       受保护的访问,子类可以访问它的属性/方法用abstract关键字定义(抽象类/抽象方法)
不允许被实例化
抽象方法必须被子类实现
把各层级的类之间共有的特性提取出来进行实现的部分叫接口
接口通过interface定义,通过implements实现
一个类只能继承一个类,但是可以实现多个接口
在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
    function createArray<T>(length: number, value: T): Array<T> {
        let result: T[] = [];
        for (let i = 0; i < length; i++) {
            result[i] = value;
        }
        return result;
    }
    createArray<string>(3, 'x');      // ['x', 'x', 'x']    function swap<T, U>(tuple: [T, U]): [U, T] {
        return [tuple[1], tuple[0]];
    }
    swap([7, 'seven']);     // ['seven', 7]1.由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法(会报错)
    function loggingIdentity<T>(arg: T): T {
        console.log(arg.length);
        return arg;
    }2.对泛型进行约束
    interface Lengthwise {
        length: number;
    }
    function loggingIdentity<T extends Lengthwise>(arg: T): T {
        console.log(arg.length);
        return arg;
    }3.泛型之间也可以相互约束
    写法一
        interface CreateArrayFunc {
            <T>(length: number, value: T): Array<T>;
        }
    写法二
        interface CreateArrayFunc<T> {
            (length: number, value: T): Array<T>;
        }    class GenericNumber<T> {
        zeroValue: T;
        add: (x: T, y: T) => T;
    }1.当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用
2.示例代码
    function createArray<T = string>(length: number, value: T): Array<T> {
        let result: T[] = [];
        for (let i = 0; i < length; i++) {
            result[i] = value
        }
        return result;
    }1.使用第三方库时,需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能
2.声明语句中只能定义类型,切勿在声明语句中定义具体的实现
3.示例代码
    declare var jQuery: (selector: string) => any4.注意
5.第三方声明文件
    npm install @types/jquery --save-dev1.如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型
2.合并的属性类型必须是唯一的
3.函数合并
4.接口合并
    interface Alarm {
        price: number;
    }
    interface Alarm {
        weight: number; 
    }
    // 等同于
    interface Alarm {
        price: number;
        weight: number;
    }5.类合并
1.声明合并
    declare function jQuery(selector: string): any
    declare namespace jQuery {
        function ajax(url: string, settings?: any): void
    }2.export
3.export default
4.commonjs规范下的export
    module.exports = foo;   // 整体导出
    exports.bar = bar;      // 单个导出    import foo = require('foo');    // 整体导入
    import bar = foo.bar;           // 单个导入    export = foo
    declare function foo(): string5.UMD库的导出
    export as namespace '导出名'6.在npm包/UMD库中扩展全局变量
    declare global {
        interface String {
            prependHello(): string
        }
    }7.模块插件(declare module)
    // index.d.ts声明
    import * as moment from 'moment';
    declare module 'moment' {
        export function foo(): moment.CalendarKey
    }
    // index.ts使用
    import * as moment from 'moment';
    import 'moment-plugin';
    moment.foo();8.声明文件中的依赖
  /// <reference types="jquery" />
  declare function foo(options: JQuery.AjaxSettings): string  /// <reference types="sizzle" />
  /// <reference path="JQueryStatic.d.ts" />
  /// <reference path="JQuery.d.ts" />
  /// <reference path="misc.d.ts" />
  /// <reference path="legacy.d.ts" />
  export = jQuery;9.自动生成声明文件
  {
      "compilerOptions": {
          "module": "commonjs",
          "outDir": "lib",
          "declaration": true
      }
  }1.将声明文件和源码放在一起(ts声明查找也遵循a=>b=>c)
2.将声明文件发布到@types下
原文:https://www.cnblogs.com/kanyu/p/11777191.html