基础类型
基础类型默认是不能相互赋值。在联合类型的帮助下可以相互赋值
type NumOrStr = number | string;type NumOrStrOrBool = number | string | boolean;let num: NumOrStr = 123;let str: NumOrStr = "string";let bol: NumOrStrOrBool = true;// 联合类型,可以用少的联合类型 赋值 给多的联合,// 多的相当于少的父类bol = str;bol = num;// str = bol; // 缺少boolean类型// num = bol; // 缺少boolean类型
接口
接口赋值时会有类型兼容转化;
多属性的类型可以赋值给 少的类型; 接口属性 多赋值少 可以
interface IAnimal{legs: number;name: string;}interface IDog{legs: number;name: string;wang: string}let a: IAnimal;let d: IDog;a = d; //可以正常赋值//d = a; // 会报错,a对象身上的类型少,给类型多的对象赋值,不安全
但是 值赋值给接口时,不会进行类型转换
interface IAnimal{legs: number;name: string;}let wangcai:IAnimal= {legs:4,name: "旺财",wang: "汪汪汪" //此处会报错,不存在的属性}
可以通过定义成变量,然后进行赋值
interface IAnimal{legs: number;name: string;}let a: IAnimal;// 定义成变量let wangcai= {legs:4,name: "旺财",wang: "汪汪汪"}a = wangcai;
函数
函数参数赋值,少可赋多
少参数函数,可以赋值给多参数的函数。少传参数可以控制参数的安全性。
let sum1 = (a:number, b:number): number => a+b;let sum2 = (a:number): number => a *10;sum1 = sum2;// sum2 = sum1; //报错,原因是无法限制b参数的类型
function forEach<T>(arr: T[], cb: (item: T, index: number, arr: T[]) => void) {for(let i = 0; i < arr.length; i++){cb(arr[i], i, arr); //这里cb必须是3个参数}}forEach([1,2,3], (item)=>{ //这里面可以传0-3个参数console.log(item);})
返回值,分基本值还是对象
返回值是联合类型sum1函数可以赋值给返回值是小范围的函数sum2
type sum1 = (a:number, b:number) => string | number;type sum2 = (a:number) => number;let s1:sum1;let s2:sum2;s1 = s2; // 返回值是单一类型可赋值给返回值是联合类型
返回值是对象,可以把多参数的类型赋值给少参数的类型
// 返回值是对象时,遵循的是接口的类型赋值转换type sum1 = (a:number, b:number) => {name: string};type sum2 = (a:number) => {name: string, age:number};let s1:sum1;let s2:sum2;s1 = s2; // 可以把多参数的类型,赋值给少参数的类型
针对参数类型和返回值类型做兼容
参逆父,返协子
函数参数:逆变
class Parent {money: number;}class Son extends Parent {house: string;}class Grandson extends Son {play: string;}function FN(cb: (person: Son) => Son) {}// 使用FN函数是,内部的cb调用,person参数的类型可以是Son,也可以是父类Parent,这是参数的逆变,使用父类型FN((person: Parent) => new Son)
函数返回值:协变
class Parent {money: number;}class Son extends Parent {house: string;}class Grandson extends Son {play: string;}function FN(cb: (person: Son) => Son) {}// FN的返回值,可以是Son类型,也可以是Son的子类型,这是返回值的协变FN((person: Son) => new Grandson)
