1. 对象类型-单独使用
const 对象名: {属性名1?:类型1,属性名2:类型2 } = { 属性名2:值2 }
const 对象名: {
属性名1:类型1,
属性名2:类型2
} = { 属性名1: 值1,属性名2:值2 }
const goodItem:{name: string, price: number, func: ()=>string } = {
name: '手机',
price: 2000,
func:function(){ return '打电话' }
}
2. 对象类型-类型别名
把类型注解封装一下,定义类型 使用 type
// 创建类型别名
type Person = {
name: string,
age: number
sayHi(): void
}
// 使用类型别名作为对象的类型:
let person: Person = {
name: '小花',
age: 18
sayHi() {}
}
function f1 (p: Persion) :void {
}
3. 对象类型-接口
当一个对象类型被多次使用时,可以有两种方式来来描述对象的类型,达到复用的目的。
-
类型别名, Type
-
接口, interface
格式
interface 接口名 {
属性1: 类型1, 属性2: 类型2,
}
-
使用
interface
关键字来声明接口 -
接口名称(比如,此处的
I
fn ),可以是任意合法的变量名称,推荐以I
开头 -
声明接口后,直接使用接口名称作为变量的类型
4. 接口和类型的区别
-
相同点:都可以给对象指定类型
-
不同点:
-
接口,只能为对象指定类型。它可以继承。
-
类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别
-
推荐:能使用 type 就是用 type
5. 接口继承
如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用
interface Point2D { x: number; y: number }
// 继承 Point2D
interface Point3D extends Point2D {
z: number
}
6. 元组( Tuple )
元组是另一种特殊的数组:
-
它确切地包含多少个元素
-
特定索引对应的类型
let pos: [number, number] = [123,456]
-
元组类型可以确切地标记出有多少个元素,以及每个元素的类型
-
该示例中,元素有两个元素,每个元素的类型都是 number
7. 字面量类型
任意的 JS 字面量(比如,对象、数字等)都可以作为类型使用
let str1 = 'hello 武汉'
const str2 = 'hello TS'
-
str1 是一个变量(let),它的值可以是任意字符串,所以类型为:string
-
str2 是一个常量(const),它的值不能变化只能是 'hello 武汉',所以,它的类型为:'hello 武汉'
-
注意:此处的 'hello TS',就是一个字面量类型,也就是说某个特定的字符串也可以作为 TS 中的类型
// 使用自定义类型:
type Direction = 'up' | 'down' | 'left' | 'right'
function changeDirection(direction: Direction) {
console.log(direction)
}
// 调用函数时,写上'',就会有类型提示:
changeDirection('up')
字面量类型约定:只能取某些个特定的值。一般和联合类型一起使用。