一,tsconfig.json
{
// 编译器选项
"compilerOptions": {
/* 基本选项 */
"target": "es5", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6','ES2015', 'ES2016', 'ES2017', or 'ESNEXT'
// 注意:target将ts转为最终target js版本是不全的,有些无法转换,无法做到完全兼容
// 例如 代理反射等功能,所以考虑兼容性必须还要使用 babel进行兼容性转换
"module": "commonjs", // 指定使用模块: 'commonjs', 'amd', 'system', 'umd','es2015'
"lib": [], // 指定要包含在编译中的库文件, ----->>>一般在后端使用,要引入库的时候使用,默认引入浏览器运行的库
"allowJs": true, // 允许编译 javascript 文件,----->有些模块是js写的
"checkJs": true, // 报告 javascript 文件中的错误 ----->检查js中有没有语法错误,应该和上面一起用
"jsx": "preserve", // 指定 jsx 代码的生成: 'preserve', 'react-native', or 'react'
"declaration": true, // 生成相应的 '.d.ts' 文件
"sourceMap": true, // 生成相应的 '.map' 文件
"outFile": "./dist/app.js", // 将输出文件合并为一个文件 ---->>>>全局作用域文件中的内容合并,全局作用域即不使用模块导出导入, 如果要合并有导入导出模块的文件,
// module必须为amd或者system
"outDir": "./", // 指定输出目录, ---->>>>编译后的js所在目录
"rootDir": "./", // 用来控制输出目录结构 --outDir.
"removeComments": true, // 删除编译后的所有的注释 --->删除编译前的注释,只检查语法的时候用
"noEmit": true, // 不生成输出文件 --->为true不生成最后的编译.js文件
"noEmitOnError":true, // 当有错误的时候,不生成编译文件(.js)
"importHelpers": true, // 从 tslib 导入辅助工具函数
"isolatedModules": true, // 将每个文件作为单独的模块 (与 'ts.transpileModule' 类似).
/* 严格的类型检查选项 */
"strict": true, // 启用所有严格类型检查选项
//下面的总开关
"noImplicitAny": true, // 在表达式和声明上有隐含的 any类型时报错;--->没有写类型的值不会被推断为any
"strictNullChecks": true, // 启用严格的 null 检查
// 例如获取dom,不成功,执行了属性,dom可能为null
"noImplicitThis": true, // 当 this 表达式值为 any 类型的时候,生成一个错误
//使用this的时候必须指定类,
"alwaysStrict": true, // 以严格模式检查每个模块,并在每个文件里加入 'use strict'
// 注意当代码中使用模块,自动就使用了严格模式
/* 额外的检查 */
"noUnusedLocals": true, // 有未使用的变量时,抛出错误
"noUnusedParameters": true, // 有未使用的参数时,抛出错误
"noImplicitReturns": true, // 并不是所有函数里的代码都有返回值时,抛出错误
"noFallthroughCasesInSwitch": true, // 报告 switch 语句的 fallthrough 错误。(即,不允许 switch 的 case 语句贯穿)
/* 模块解析选项 */
"moduleResolution": "node", // 选择模块解析策略: 'node' (Node.js) or 'classic' (TypeScript pre-1.6)
"baseUrl": "./", // 用于解析非相对模块名称的基目录
"paths": {}, // 模块名到基于 baseUrl 的路径映射的列表
"rootDirs": [], // 根文件夹列表,其组合内容表示项目运行时的结构内容
"typeRoots": [], // 包含类型声明的文件列表
"types": [], // 需要包含的类型声明文件名列表
"allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入。
/* Source Map Options */
"sourceRoot": "./", // 指定调试器应该找到 TypeScript 文件而不是源文件的位置
"mapRoot": "./", // 指定调试器应该找到映射文件而不是生成文件的位置
"inlineSourceMap": true, // 生成单个 soucemaps 文件,而不是将 sourcemaps 生成不同的文件
"inlineSources": true, // 将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap 或 --sourceMap 属性
/* 其他选项 */
"experimentalDecorators": true, // 启用装饰器
"emitDecoratorMetadata": true // 为装饰器提供元数据的支持
},
/*指定要编译的文件 **表示任意目录 *表示任意文件 */
"include":[
"./src/**/*" // src下任意目录下面的任意文件
]
,
// 包括和排除,应设置,不然,全局变量的范围会很大,
//排查的,有默认值
"exclude":
[
"./scr/hello/**/*"
]
,
// 编译具体的文件
"files":["xx.ts"]
}
主要要注意;include/strict(建议为true)/target(建议为es5)/outDir 这几项配置
二,类型声明
Ts中有很多可以作为变量的类型,这里要分清楚变量的名字,变量的值,变量的类型这三个概念
let a:string=222;
其中a是变量的名字
string是变量的类型
222是变量的值
有些变量类型和变量值是一样的,例如:null,undefind等,还有变量的值也可以作为类型,例如:
let a:1=1; // 类型为1
//1.基本类型, number,string,Boolean,null,undefined,
let num: number = 11;
let sr: string = "htll";
let ddf: null = null; // null类型的值只能是null
let und: undefined = undefined; // 只能是undefined
//let bool: boolean = null; //
// 2.字面量类型声明
// 类似于常量
let a: 11; // 只能是类型对应的值
a = 11;
//a=12
let b: "hello";
let c: string;
c = "hell";
c = "ddf";
// 字面量作为类型的应用(联合类型)
let selector: "A" | "B";
selector = "A";
selector = "B";
let age: string | number;
// 3.any 表示任意类型,关闭类型检测
let an: any = 11; // 显示any
let ang; // any
ang = 11;
an = "hell";
// 将any类型的数据赋值给其他类型
c = an; //string可以
//c=ang;// 不行
selector = an; // 字面量类型可以是其他值
// 4.unknown 表示未知类
let f: unknown;
f = 10;
f = "abc";
f = true;
let s: string;
f = "helll";
//s=f; // 和any的区别:
// 任意类型可以赋值给它,他不能赋值给任意类型,any是任意类型值可以赋值给它,他也可以赋值给任意类型
// unknown是any的安全类型,如果必须将unknown赋值给其他类型
//1. 复制前类型判断
if (typeof f === "string") {
s = f;
}
// 2.类型断言,
s = f as string; // 告诉编译器f就是字符串,
s = <string>f; // 第二种写法,注意不是泛型,泛型是 xxx
// 5.void //表示函数没有返回值,never 表示没有值
//let vo: void = null;
function fn(): void {}
// 永远不会返回值,
function fn2(): never {
throw new Error("出现错误");
}
// void表示函数返回null或者undefined,一般函数即使不return,就是返回undefined
// never表示函数结果完全不返回,例如函数中有抛出错误,那么函数直接回停止退出,
//不返回任何值,就应该使用never
/*总结: 作为类型的有如下:
(1)基本类型:number,string,boolean,symbol,null,undefined,bigint
(2)字面量(就是其他类型的值):11,"str",true,null,undefined,;
(3)联合类型: 基本类型|字面量
(4)any和unknown:any类型可以被任意类型赋值,也可以赋值给任意类型,而unknown不能直接
赋值给别人,两种方法,一先判断类型,第二使用断言类型
(5)void 和 never 这两个用于函数返回值,void表示返回undefined,null,never表示不返回任何数据
注意区分类型声明和赋值:
(1)null和undefined的类型都只有一个值,就是他们本身
(2)any和unknown可以被任意类型赋值
(3)void和never用在函数返回值,可以被undefined赋值
(4)其他基本类型都只能,被基本类型的值赋值
*/
// 6.object类型
let ob: object; // 限制为一个对象
ob = {};
ob = function () {};
let o: {}; // 限制对象的属性
// 限制为具体对象的属性的类型,字面量方式
let obj: {
name: string; //
cse?: number; //
[Name: string]: string | number | undefined;
};
// 不能多不能少
// ?表示对象可选 注意可选对象类型是联合类型 number|undefined
// [propName:string]:any 表示属性名是任意字符串,注意propName是任意的
// [name:type] []表示属性名,name是属性名的值,type是属性名的类型
// 值是任意类型,属性名是string时,值要是其他类型值的并集
// 注意:对象的类型声明,的key是固定的,而下面函数参数的名字是不固定的
obj = { name: "xdf" }; // 赋值
//7.Function
let func: Function; // 和上面的object差不多,只要是是函数即可,范围太广
func = function () {};
func = new Function();
// 字面量形式限制函数
// 设置函数结构的类型声明
let funct: (a: number, b: number) => number;
funct = function (n1: number, n2: number): number {
// 赋值
return 22;
};
// 8.array 两种声明方式
// 基本类型数组声明
let ar: string[];
ar = ["a", "b"]; // 数组赋值
//泛型数组
let arr: Array<number>;
// 9.元组,就是固定长度的数组
let tu: [string, string];
tu = ["eer", "dff"]; // 个数类型固定
// 10.枚举 enum 几个值之间选
// let en: { name: string; gender: 0 | 1 };
// en = {
// name: "dfsdf",
// gender: 1, // 用0一代替男女
// };
enum Gender {
Male,
Female,
}
let en: { name: string; gender: Gender };
en = {
name: "dfsdf",
gender: Gender.Male, // 直接获得字符串,和联合类型类似
};
if (en.gender === Gender.Male) {
console.log("枚举成功");
}
// 10 . 联合类型(或)和&(并且)
let lh: string | number; // 类型为string或者是number
let lh1: 11 | "sdfdd"; // 字面量类型
let lh2: string & number; // 即使number又是string,不可能
let lh3: { name: string } & { age: number };
//lh3={name:"dfd"} // 对象必须包含两种属性
// 11.类型别名 为类型起名字
let K: 1 | 2 | 3 | 4 | 5; //如果k的类型要服用,则很麻烦
type rand = 1 | 2 | 3 | 4 | 5;
// 简化类型名字,特别是联合类型,或者函数类型,对象类型
let KK: rand;
KK = 1;