这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战”
类型
基本类型
typescript 在JavaScript的语法基础上 支持对变量存储的类型进行限制
定义基本类型
- string 和 number 和 boolean 和 symbol
*
StringNumberBooleanSymbol是String,Number,Boolean,Symbol被定义的接口
let str: string = '字符串'
let num: number = 12
let bool: boolean = false
let sbl: symbol = Symbol()
- null 和 undefined
*默认情况下null和undefined是所有类型的子类型, 所有类型及时被限定了类型,也可以被赋值为 null 和 undefined。
let u: undefined = undefined
let n: null = null
复杂类型
- 数组 Array
*和js区别ts中的数组如果用这种方式 数组内部只能存放指定类型的数据。
*可以使用any存放任何类型。
*可以使用|指定多种类型。
let list: number[] = [1,2,3]
let list: Array<number> = [1, 2, 3]; // 接口范型
let list: (number|string)[] = [1,2,3,'123']
let list:[] = [1,2,'3'] // 错误,这是元组
- Object 和 object
*object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
*object 可以是 Object 接口定义的类型, Object 可以是任意值。
*Object是定义Object对象的接口,只能调用Object接口中包含的方法。
let obj: object = []
let obj: object = {}
其他
- 元组
*表示一个固定元素的数组。
let tuple: [number, number|string] = [1, 2]
tuple = [1, '2']
- 枚举
*枚举 本质上就是一个键值对对象,值默认从0开始,同时值也会作为键,它的值是对应的键。
*不是数组,em[2]这种实际是访问的.2这个属性,并不是下标。
*一般不需要关心值具体是多少,当然也可以自己设置部分或全部。
enum type = {right, center, left = 5}
type.right // 0
type[2] // undefined
type[5] // undefined
- Any
*any表示任意类型,不进行类型检查,使用在声明中,和Object接口的区别是能调用任意方法。
let notSure: any = 4
notSure.ifItExists() // 不检查
notSure.toFixed() // 不检查 一定存在 Number.prototype.toFixed
let prettySure: Object = 4 // Object 值可以是任意类型
prettySure.toFixed() // 检查的是Object接口拥有的属性
- Unknown [3.0+]
*unknown表示未知类型,会进行类型检查,只可以将它赋值给any和unknown。如果不缩小类型,就无法对 unknown 类型执行除此之外的任何操作。
let un: unknown = 4
let ay: any = un
let Obj: Object = un
let num: number = un // 不能将类型“unknown”分配给类型“number”。
let obj: object = un // 不能将类型“unknown”分配给类型“object”。
类型缩小可以使用 类型断言 与 类型收缩
let un: unknown = 4
let num: number = <number>un //类型断言
// ======================================
let un: unknown = 4
let num: number
typeof un === 'number' && (num = un) // 类型收缩 我们自己处理了类型判断时
-
void
*js中的void是一个一元操作符,可以跟任意值或表达式。返回undefined,优先级较高。
*ts中,void表示值是undefined或null,相等于类型被设置为 undefinde|null 。 -
Never
never类型表示的是那些永不存在的值的类型。
never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使 any也不可以赋值给never。*似乎没有什么用,就是这个东西的结果什么也没有, 官方文档是一个不会有返回值的函数,函数默认返回undefined,这个东西
undefined都不返回。
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message)
}
// 推断的返回值类型为never // error 是 never 类型
function fail() {
return error("Something failed")
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
- 类型断言
*在使用时临时的变更类型。
*在TypeScript里使用JSX时,只有as语法断言是被允许的。
// “尖括号”语法
let someValue: any = "this is a string"
let strLength: number = (<string>someValue).length
let someValue: number = 1223;
let strLength: number = (<Object>someValue) // 报错 Obeject 不能被赋值给 number
// as 语法
let someValue: any = "this is a string"
let strLength: number = (someValue as string).length
- 解构声明
*定义右侧对象属性 a:string b:string,解构赋值时a被命名为newa
let {a: newa, b}: {a: string, b:string} = {a: 'null', b: null}
newa // 'null'
b // null
- 可选
let obj: {a: any, b?: number}
obj = {a: 1234123} // b是可存在可不存在的
*为对象声明属性需要指定全部拥有的和可能拥有的,如不确定可增加任意属性类型
- 对象任意属性 与 只读类型
interface J {
readonly id: number
[propName: string]: any // 这里设置的是任意类型
}
let obj1: J = {
id: 1,
name: 'name',
age: 18
}
obj1.id = 2 // 报错 id 是只读的
*如果对象键是数字呢?可以使用映射对象类型
- 映射对象类型
type J = {
[propName in string | number]: any //这里设置的是任意类型
;
} & {
readonly id: number;
};
let obj: J = {
id: 1,
name: 'haha',
age: 4,
a: 1,
b: 2,
1: 5
}
*如果对象键是symbol类型呢?
- 对象键symbol类型/unique symbol类型
const key1 = Symbol()
const key2: symbol = Symbol()
const key3: unique symbol = Symbol() //TS 2.7+
type O = {
[propName in string | number]: any
} & {
readonly id: number;
[key1]?: any,
[key2]?: any, // 类型文本中的计算属性名称必须引用类型为文本类型或 "unique symbol" 类型的表达式。
[key3]?: any,
}
let obj1: O = {
id: 1,
name: 'haha',
age: 4,
a: 1,
1: 5
}
obj1[key1] = 2
obj1[key2] = 2 // 类型“symbol”不能作为索引类型使用。
obj1[key3] = 2