TypeScript

它可以说是js的语法糖,也可以说是es6的超集

安装与编译

  npm install typescript -g
  tsc helloworld.ts
  tsc --init // 生成一个tsconfig.json文件
  菜单  任务-运行任务 tsc:监视-tsconfig.json然后就可以自动生成代码

基础类型

与JS几乎相同,可以在typescript中编写ES6、ES5语法,而且扩展了JS的语法

** 尽可能地使用let来代替var

let isOver: boolean = false;      // 布尔类型
let num: number = 6;              // 数字类型
let hexNum: number = 0xf00d;
let binNum: number = 0b1010;
let name: string = 'Hello World'; // 字符串

/* es6中的小撇号(模板字符串)*/
let name: string = `Gene`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ name }.

I'll be ${ age + 1 } years old next month.`

/* 数组 */
let arr: number[] = [1,2,3]; // 类型元素数组
let arr: Array<number> = [1,2,3];
let arr:any[] = [1,2,3]; // 类型元素数组

/* 元组Tuple */
let x: [string,number];
x = ['hello',10];

x = [10.'hello']; // error
// 当访问一个越界的元素,会使用联合类型替代:
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布尔不是(string | number)类型

/* 枚举 enum */
enum Color {Red,Green,Blue} // || enum Color {Red = 1,Green = 9,Blue}
let c: Color = Color.Red;
let colorName: string = Color[2]; // 'Green'

/* Any
 * 在对现有代码进行改写的时候,any类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。
 * 你可能认为 Object有相似的作用,就像它在其它语言中那样。 但是 Object类型的变量只是允许你给它赋任意值 -
 * 但是却不能够在它上面调用任意的方法,即便它真的有这些方法
 **/
let notSure: any = 5;
notSure = false;
notSure = 'maybe';
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.

let list: any[] = [1, true, "free"];

/* Void */
// 表示方法没有返回值
function run():void {
   console.log('run')
}

/* Null & Undefined*/

var num:number | undefined;
num = 123
console.log(num);

/* Never */
// 从来都不会出现的值
var a:never;
a=(()=>{
    throw new Error('错误')
})()

/* Object */

/* 类型断言(类型转换) */

变量声明


接口

起到一种规范和限制的作用: 属性类接口,函数类型接口,可索引接口




函数

  var run = function():number {
    return 123;
  }
  function getInfo(name:string,age:number):string {
    return name + age;
  }

  // 方法的可选参数
  // es5中方法的实参和形参可以不一样,但是ts中必须一样,如果不一样就需要配置可选参数
  // 可选参数必须配置到参数的最后面!!!
  function getInfo(name:string,age?:number):string {
    if(age) {
      return name + age;
    } else {
      return name;
    }
  }
  alert(getInfo('lipeng'))
  // 方法的默认参数
  // es5中没法设置默认参数,es6和ts中可以设置默认参数
  function getInfo(name:string, age:number = 20):string {
    if(age) {
      return name + age;
    } else {
      return name;
    }
  }
  alert(getInfo('lipeng'))
  // 方法的剩余参数 (三点运算符)
  function sum(a:number, b:number, c:number, d:number):number {
      return a+b+c+d;
  }
  function sum1(...result:[]):number {
      var sum = 0
      result.forEach(function(num){
          sum += num
      })
      return sum;
  }
  sum1(1,2,44,5,7,8);
  // 方法的重载
  // java中方法的重载:指的是两个或者两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况
  // ts中的重载,通过为同一个函数提供多个函数类型定义来试下多种功能的目的
  function getInfo(name:string):string;
  function getInfo(age:number):number;
  function getInfo(str:any):any {
    if(typeof str === 'string') {
      return str
    } else {
      return str + 10
    }
  }
  // 箭头函数
  // 箭头函数中的this指向上下文
  setTimeout(() => {
      alert('num')
  },1000)

使用enum 维护常量


  // 使用 const enum 维护常量
  const enum TODO_STATUS {
    TODO = 'TODO',
    DONE = 'DONE',
    DOING = 'DOING'
  }
  function todos(status:TODO_STATUS):number[] {
      return []
  };
  todos(TODO_STATUS.TODO)

使用 VS Code 有时会出现,使用 tsc 编译时产生的问题与 vs code 提示的问题不一致 找到项目右下角的 Typescript 字样,右侧显示它的版本号,可以点击选择 Use Workspace Version,它表示与项目依赖的 typescript 版本一致。 或者编辑 .vs-code/settings.json

  {
    "typescript.tsdk": "node_modules/typescript/lib"
  }

代码检查

两个方案:1、TSLint 2、ESLint + typescript-eslint-parser(建议使用TSLint)

TSLint 的优点:

  • 专为 TypeScript 服务,bug 比 ESLint 少
  • 不受限于 ESLint 使用的语法树 ESTree
  • 能直接通过 tsconfig.json 中的配置编译整个项目,使得在一个文件中的类型定义能够联动到其他文件中的代码检查

ESLint 的优点:

  • 基础规则比 TSLint 多很多
  • 社区繁荣,插件众多

一、使用TSLint

  npm install --save-dev tslint

  // 创建配置文件 tslint.jsonp
  {
    "rules": {
        // 必须使用 === 或 !==,禁止使用 == 或 !=,与 null 比较时除外
        "triple-equals": [
            true,
            "allow-null-check"
        ]
    },
    "linterOptions": {
        "exclude": [
            "**/node_modules/**"
        ]
    }
  }

  // package.json中添加tslint脚本
  {
    "scripts": {
        "tslint": "tslint --project . src/**/*.ts src/**/*.tsx",
    }
  }

  // 运行检查
  npm run tslint

二、使用ESLint

results matching ""

    No results matching ""