基础类型
基础类型默认是不能相互赋值。在联合类型的帮助下可以相互赋值
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)