// 要使用typescript需要全局安装 通过tsc -v 来验证是否安装成功
npm i -g typescript
// ts 文件中完全可以写js语法, 完全兼容js
// ts 本身在运行时,会转化为js文件,从而执行
// ts 可以在定义变量的时候,确认他的类型,防止赋予不同类型的值
// 类型都要小写
/**
类型有 number, string, boolean, object, any(任意类型), unknown(类型安全的any), void(空置 undefined), never(没有值), array, tuple(TS新增类型,固定长度的数组), enum(TS新增类型, 枚举类型)
**/
// 声明一个变量,同时指定类型为number
let a : number;
// 因为a类型已设置,所以只能赋值数字
a = 10;
a = 20;
// a = 'hellow' //因为类型不是number,所以会报错
// 声明完变量直接赋值
let b : boolean = false;
// js中函数是不考虑参数的类型和个数
function sum(a, b){
return a + b;
}
console.log(sum(123, 456)); // 579
console.log(sum(123, '456')); // '123456'
// ts 参数可以增加类型,同时函数本身的返回值也可以定义类型
function sum_(a: number, b: number): number{
// return a + b + 'hello; // 报错
return a + b;
}
console.log(sum_(123, 456)); // 579
// console.log(sum_(123, '456')); // 报错 Argument of type 'string' is not assignable to parameter of type 'number'
// object 标记JS对象, 在ts中不实用,因为 对象是对象, 方法还是对象, 对象太多了,没做太多限制
/**
{} 用来指定对象中可以包含的属性
语法: {key: value, key: value}
在属性名后增加?, 表示属性是可选的, 可以不用赋值
**/
// 所以一般如下实用
let c : {name: string}; // 有且只有一个属性
// c = {}; // 报错,未定义name
c = {name: 'Alan'}
// c = {name: 'Alan', age: 18} // 报错,因为没有定义age属性,所以c定义的时候,可以固定对象的结构,key值
// 同时,在属性名后增加?, 表示属性是可选的, 可以不用赋值
let d : {name: string, age?: number}; // name 强制,age可选
d = {name: 'Alan'};
d = {name: 'Alan', age: 12};
// 如果想要不限制任意属性,则需要 增加任意类型的属性
let e : {name: string, [propName: string]: any}; // propName不固定,可随意写
e = {name: 'Alan', age: 18, dob: 19901120}
// 通过箭头函数,来设置函数结构的类型声明
// 语法: (形参: 类型, 形参: 类型 ...) => 返回值
let f:(a: number, b:number) => number;
f = function (n1, n2):number { // 如果在此处定义n1为不是number的类型,则同样会报错
return n1 + n2;
}
// 数组类型
// string [] 字符串数组
// number [] 数字数组 or Array<number>
// any [], Array<any> 任意数组,但是不建议用any
/**
* tuple 元组 固定长度的数组
* 长度固定后,储存效率高,变化几率小一点
* 语法: [类型, 类型, 类型] 不会太多,太多直接用数组
*/
let h: [string, string, number];
h = ['hello', 'word', 123];
/**
* enum 枚举
*
*/
enum Gender {
Male, // Male = 0,
Female, // Female = 1,
}
let i: {name: string, gender:Gender}
i = {name: 'Alan', gender: Gender.Male};
console.log(i.gender === Gender.Male);
/**
* & 表示同时
*/
let j: {name: string} & {age: number};
j = {name: 'Alan', age: 18} // 必须存在两个属性
/**
* 类型的别名.
* 简化类型
*/
type myType = 1 | 2 | 3 | 4 | 5;
let k: 1 | 2 | 3 | 4 | 5;
let l: myType;
let m: myType;
k = 5;
k = 3;