Ts学习(联合类型,交叉类型,TS函数)
联合类型和类型别名
- 联合类型:可以用来约束只取某些类型或者某些值中的一个。
const sayHello = (name: string| number)=>{
if (typeof name === 'number') {
return 10 + name
}
}
sayHello("semlinker");
sayHello(123);
sayHello(true);
小结:这里定义的是sayHellow的参数只能为字符串和数字类型,里面判断属性,是数字用来累加,当传入其他类型,会报错,说该类型不能赋值给那个对象。
- 可辨识联合:
enum CarTransmission {
Automatic = 200,
Manual = 300
}
interface Motorcycle {
vType: "motorcycle"; // discriminant
make: number; // year
}
interface Car {
vType: "car"; // discriminant
transmission: CarTransmission
}
interface Truck {
vType: "truck"; // discriminant
capacity: number; // in tons
}
type Vehicle = Motorcycle | Car | Truck;
const EVALUATION_FACTOR = Math.PI;
function evaluatePrice(vehicle: Vehicle) {
switch(vehicle.vType) {
case "car":
return vehicle.transmission * EVALUATION_FACTOR;
case "truck":
return vehicle.capacity * EVALUATION_FACTOR;
case "motorcycle":
return vehicle.make * EVALUATION_FACTOR;
}
}
const myTruck: Truck = { vType: "truck", capacity: 9.5 };
evaluatePrice(myTruck);
小结:首先明白什么是可辨识, 联合类型中的每个元素都含有一个单例类型属性 ,例如上例中的truck,car,motorcycle,然后当使用时候,通过switch判断是哪个类型,然后做出相应操作。
- 类型别名:用type方法,把一个类别定义成一个变量。
type bieMing = number|string
let hello = (message:bieMing) =>{
return message
}
交叉类型
含义:交叉类型就像数学中的并级,通过&运算符创建一个新的point类型,表示一个含有x和y坐标的点,然后定义一个point类型的变量并且初始化。
- 同名基础类型属性的合并:当合并时候,有两个类型中相同的属性名字,类型不同,合并以后类型会变成never。
interface X {
a: string;
b: string;
}
interface Y {
a: number
c: string
}
type XY = X & Y;
type YX = Y & X;
let intersection: XY;
let intersections: YX;
intersection = { c: 6, d: "d", e: "e" };
intersections = { c: '6', d: "d", e: "e" }
小结:这段代码放进编辑器,c会报错,intersection会说,不要将数字赋值给never,intersections会说,不要将string赋值给never,c原本类型是x中string,y中number,合并后变成never。
- 同名非基础类型属性的合并
interface D { d: object; }
interface E { e: string; }
interface F { f: number; }
interface A { x: D; }
interface B { x: E; }
interface C { x: F; }
type ABC = A & B & C;
let abc: ABC = {
x: {
d: {1:true},
e: 'coolFish',
f: 666
}
};
console.log('abc:', abc);
小结:非基础类型合并时候,存在多个相同成员,但是成员类型为非基础数据类型,那么可以成功合并。
Ts函数
Ts函数和Js函数的区别:ts有类型,有函数类型,参数可选,函数重载。
参数类型和返回类型。
function createUserId(name: string, id: number): string {
return name + id;
}
- 可选参数和默认参数。
function createUserId(
name: string = "semlinker",
id: number,
age?: number
): string {
return name + id;
}
小结:这里的可选参数是age?:number, "semlinker"是name的默认参数 ,声明函数时,可以通过 ? 号来定义可选参数,比如 age?: number 这种形式。「在实际使用时,需要注意的是可选参数要放在普通参数的后面,不然会导致编译错误」 。
- 函数重载:就是相同的函数名,不同的参数数量或者类型,通过判断参数,选择不同的执行程序。
class Calculator {
add(a: number, b: number): number;
add(a: string, b: string): string;
add(a: string, b: number): string;
add(a: number, b: string): string;
add(a: any, b: any) {
if (typeof a === 'number' && typeof b === 'number') {
return a.toString() + b.toString();
}
return a + b;
}
}
const calculator = new Calculator();
const result = calculator.add(123, 123);
console.log(result)
小结:这里最后传了两个number类型,所以最后进入if内,返回的123123,