TypeScript入门 | 青训营笔记

33 阅读3分钟

1 为什么TypeScript

动态类型和静态类型

  • 动态类型语言在执行阶段才去进行类型检查,如:JavaScript、Python
  • 静态类型在编译阶段做类型检查,如:Java、TypeScript

弱类型与强类型

  • 弱类型语言:不同类型的变量可以混合计算。弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。
  • 强类型语言:不管在编译时还是运行时,一旦某个类型赋值给某个变量,它会持有这个类型,并且不能同其他类型在计算某个表达式时混合计算。即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。

  • JavaScript:动态类型、弱类型语言
  • TypeScript:静态类型、弱类型语言(会进行类型转换)

静态类型的优势:

  • 可读性增强:基于语法解析TSDoc,ide增强
  • 可维护性增强:在编译阶段暴露大部分错误

2 基本语法

2.1 基本类型

  • Number
  • String
  • Boolean
  • Undefined
  • Null
  • BigInt(ES6)
  • Symbol(ES6)
  • any:ts特有的一个类型,表示所有类型,任何类型。
/*字符串*/
const q:string = 'string';
/*数字*/
const w:number = 1;
/*布尔值*/
const e:boolean = true;
/*null*/
const r:null = null;
/*undefined*/
const t:undefined = undefined;

2.2 对象类型

    • 使用interface(接口)来定义对象类型。
    • readonly:表示只读属性,表示属性不可以在对象初始化之外进行赋值
    • ?:可选属性,表示属性可以存在也可以不存在

2.3 函数类型

可采用接口interface形式定义函数类型

interface IMult {
  (x: number, y: number): number
}

const mult: IMult = (x, y) => x * y
2.3.1 函数重载

2.4 数组类型

/*「类型+方括号」表示*/
type IArr1 = number[];
/*泛型表示*/
type IArr2 = Array<string | number | Record<string, number>>;
/*元祖表示*/
type IArr3 = [number, number, string, string] ;
/*接口表示*/
interface IArr4 {[key: number] : any;}

const arr1: IArr1 = [1, 2, 3, 4, 5, 6];
const arr2: IArr2 = [1, 2, '3', '4', {a: 1}];
const arr3: IArr3 = [1, 2, '3', '4'];
const arr4: IArr4 = ['string', () => null, {}, []];

2.5 泛型

/*泛型接口&多泛型*/
interface IX<T, U> {
    key: T;
    val: U;
}
/*泛型类*/
class IMan<T> { instance: T; }
/*泛型别名*/
type ITypeArr<T> = Array<T>;
2.5.1 泛型约束

使用泛型的时候,可以使用泛型约束来将泛型限制在一定范围内。使用extends关键字,限制泛型的类型。

/*泛型约束:限制泛型必须符合字符串*/
type IGetRepeatStringArr = <T extends string>(target: T) => T[];
const getStrArr: IGetRepeatStringArr = target => new Array(100).fill(target);
/*报错:类型"number"的参数不能赋给类型"string”的参数*/
getStrArr(123);
2.5.2 泛型参数默认类型

泛型可以使用=来设置默认的类型。

/*泛型参数默认类型*/
type IGetRepeatArr<T = number> = (target: T) => T[];
const getRepeatArr: IGetRepeatArr = target => new Array(100).fill(target);
/*报错:类型"string"的参数不能赋给类型“number"的参数*/
getRepeatArr('123')

3 高级类型

  • 联合类型:|,联合类型表示一个值可以是几种类型之一。
  • 交叉类型:&,多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
  • 类型保护与类型守卫