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