编辑器配置文件
{
"compilerOptions": {
"target": "es5", // 指定 ECMAScript 目标版本:"ES3" (默认), "ES5", "ES6"/"ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020",
"lib": ["es2023","dom"],// 指定包含哪些库,一般不写,因为会根据target自动导入需要的库
"module": "commonjs", // 指定模块代码生成:"none", "commonjs", "amd", "system", "umd", "es2015", "es2020", "esnext",每种导入导出的语法有些不太一样,如nodejs和amd
"strict": true, // 启用所有严格类型检查选项
"esModuleInterop": true, // 允许从 CommonJS 模块导入 ES 模块
"skipLibCheck": true, // 跳过库文件的类型检查
"forceConsistentCasingInFileNames": true, // 防止将文件名中的大小写不一致视为不同的文件
"outDir": "./dist", // 指定输出目录
"rootDir": "./src", // 指定源代码根目录
"sourceMap": true, // 生成相应的 .map 文件
"declaration": true, // 生成对应的 .d.ts 文件
"noImplicitAny": true, // 使用任何表达式或声明时不显式指定其类型,则使用 any 类型
"removeComments": true, // 删除编译后的注释
"noEmitOnError": true, // 存在编译错误时,不输出编译结果
"allowSyntheticDefaultImports": true // 允许从没有默认导出的模块中默认导入
},
"include": [
"src/**/*" // 包括 src 目录下的所有文件
],
"exclude": [
"node_modules" // 排除 node_modules 目录下的所有文件
]
}
类型
加粗为ts特有
布尔值:
let v: boolean = false;
数字:
let v: number = 1;
字符串:
let v: string = "1";
数组:
let arr: number[] = [1, 2, 3];
或let list: Array<number> = [1, 2, 3];
元组Tuple:
let x: [string, number, ..];
x只能是满足类型注释中对应位置的类型的数组枚举:
enum Color {Red, Green};
默认是从0开始编号,也可以对某个
Red = 1
或所有手动赋值,没有赋值的是前面的+1
,也可以通过Color[index]
访问其键any:如果没有类型注释那么所有的都是any类型
never:表示永不存在的值,一般会用在函数返回值,表示该函数不会返回,该函数内部一般是抛出异常
unknown:和any类似,但是不能赋值给除unknown之外的任何类型,除非经过适当的类型检查,如类型断言
类型断言
适用于ts不知道某个变量类型的时候,你可以告诉它这是什么类型
<类型>:有点类型强转的感觉
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
// 告诉编辑器这个类型是这个
as语法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
类型别名
关键字type,用于给类型起别名
语法:type 别名 = 类型
type Age = number;
联合类型
可以是多种类型中的一种
语法:let 变量: 类型1 | 类型2 | ...
let a: number | string;// a可以是number或string
交叉类型
必须具有多个属性
语法:类型1 & 类型2
type CombinedType = Type1 & Type2;
字面量类型
就是使用具体的值(常量)赋值给变量,字面量类型可以是字符串、数字或布尔值,
确保变量或函数参数只能取这些特定的值。
函数类型
下面的语法中格式称为调用签名(或叫类型签名)
语法:(参数类型1,参数类型2...)=>返回类型
let func: (a: number, b: number)=>number;
// 表明func变量能赋值为下面这样类型的函数
func = function(a: number, b: number): number{
return a + b;
}
泛型
使用
<>
包裹,就想java中的一样
函数泛型:<T>(a: T, b: number)=>T;
泛型别名:type myVar<T> = {name: T, age: number};
泛型约束:<T extends parentT>
默认:<T = number>
如果没传类型,那么就是number
接口
interface jiekou{
name: string,
age?: number,
[index: number]: string,
[propName: string]: number,
readonly pass: string
}
可选属性
?:
:这样表明该属性可有可无readonly:该属性为只读
[propName]:这种就是索引签名,支持字符串和数字,表示该接口有多个这种类型的属性
类
class Greeter {
public greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
get fullName(): string {
return this._fullName;
}
set fullName(newName: string): string {
if (passcode && passcode == "secret passcode") {
this._fullName = newName;
}
else {
console.log("Error: Unauthorized update of employee!");
}
}
}
let greeter = new Greeter("world");
继承:和java一样
实现:和java一样
属性访问权限:
public
,private
,protected
这三种修饰符:
- readonly:只读
- static:静态成员
存取器set,get:主要是用来在访问和设置的时候处理一些逻辑
抽象类:class前加上
abstract