持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情juejin.cn/post/714765…
今天主要类型断言不太明白,所以没有整理笔记,大家可以去官网自己看看。自己对于理解的部分敲了一点代码。
联合类型
就是在声明的时候可以添加多个类型声明,用|来分隔类型。
访问联合类型的属性或方法
当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
对象的类型——接口(Interface)
在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。 简单来说:接口就是用来描述你创建的对象是什么样的,class用来实现它
interface Person { //这的Person是接口。并不是对象
name: string;
age: number;
}
let tom: Person = {//这个tom的类型就要符合Person类型,所以tom的类型就是Person类型
name: 'Tom',
age: 25
};
- 定义的变量比接口少了一些属性是不允许的
- 多一些属性也是不允许的:
可选属性
如果一个属性可写可不写,那么在定义接口的时候可以在该属性后面添加?来声明,声明的时候不写该属性也不会报错。
interface Person {
name:string,
age?:number //用类创建时不写该属性也不会报错,但注意再次基础上添加属性的话依然会报错。
}
任意属性
interface Person {
name: string;
age?: number;
[propName: string]: any;//这的any也可以写成联合类型 例如: [propName:string]:string | number
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
只读属性
interface Person {
readonly id: number; //这时候id就是只读的,不能去修改
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 111,
name: 'Tom',
gender: 'male'
};
tom.id = 222; //在这里修改id就会报错
上面这样写的时候id是不可更改的属性。
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
tom.id = 89757;
- 上面的而例子中tom第一次初始化的时候没有id属性,创建完之后添加的id属性,不能这样创建,在tom初始化没有id属性时就会报错,然后会报第二个错id不能更改 注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
数组
- let stuList :number[]=[1,2,3];//如果它里面有字符串会报错
- 为数组添加元素也会进行验证类型
- 我们也可以使用数组泛型(Array Generic)
Array<elemType>来表示数组:
let fibonacci: Array<number> = [1, 1, 2, 3, 5];
用接口表示数组§
接口也可以用来描述数组:
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
虽然接口也能描述数组,但使用起来比较复杂,所以很少使用。
类数组
大多数都是用内置的接口声明类数组IArguments, NodeList, HTMLCollection等。
上例中,arguments 实际上是一个类数组,不能用普通的数组的方式来描述,而应该用接口。
function sum() {
let args: {
[index: number]: number;
length: number;
callee: Function;
} = arguments;
}
any 在数组中的应用§
any在数组中的使用
一个比较常见的做法是,用 any 表示数组中允许出现任意类型:
let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];
函数的声明
- 函数是输入和输出形式,所以输入和输出都需要声明。
- 输入:指的就是参数,要进行声明。
- 输出:指的就是返回值,要进行声明,在函数的后面进行声明。
- 例如:
function a( x:number,y:number ):any {} - 注意,输入多余的(或者少于要求的)参数,是不被允许的:
表达式声明函数
用匿名函数时,要给等号左边的变量进行声明成函数。
let mySum = function (x: number, y: number): number {
return x + y;
};
上面这种声明会报错,因为mySum没有声明,所以要用下面的语法进行声明
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
};
左边是形参的声明 => 右边是返回值的声明
可选参数
可选参数后面不允许再出现必需参数了:
类型断言
断言类型的约束
- 联合类型可以被断言为其中一个类型
- 父类可以被断言为子类
- 任何类型都可以被断言为 any
- any