TypeScript文档类型:
类型推论
联合类型
类型断言
类型守卫
类型推论
:::warning TypeScript会在没有明确指定类型的时候,推测出当前变量的类型。 :::
let str = 'str'
// let str: string , ts会推论出它是string
联合类型
:::warning
我们之前讲过any类型,这个类型是大而全的一种类型,涵盖所有类型。
如果我们不希望范围这么广泛,只包含我们指定的类型,就叫联合类型
:::
示例
let numberOrString: number|string
numberOrString = 'abc'
numberOrString = 123
// 当TS不确定一个联合类型的变量到底是那个类型的时候,
// 我们只能访问到这个联合类型的多有类型里共有的属性或方法。
// 如: toLocaleString, toString, valueOf。
// 像 length这种本身strubg有的方法就没办法使用了。
let numberOrString: number|string
numberOrString.length // 类型“number”上不存在属性“length”
类型断言
:::warning
有时候我们使用了联合类型,但又确实需要在不确定类型的情况下使用某个类型特有的方法。
那么就要使用类型断言 as , 告诉编译器你更懂这个类型,并且不应该发出错误。
:::
实例
function getLength(input:string | number): number {
// 这段代码的意思是,我就要把它看作string类型,
// 要求ts可以访问string的方法
// 但如果他不是真的string,那么也不会报错,只是没有length这个属性而已。
const str = input as string;
if (str.length){
return str.length
} else {
// 来到这里就会把它看作number类型。
const number = input as number
return number.toString().length;
}
}
类型守卫
:::warning 当遇到一个联合类型的时候,使用条件语句,它可以自动缩小类型的范围。 ::: :::danger 其实类型守卫只不过是使用条件语句罢了,ts会只能的帮我们去做这个范围缩小和判断。 :::
实例
// 使用类型断言
function getLength(input:string | number): number {
// 这段代码的意思是,我就要把它看作string类型,
// 要求ts可以访问string的方法
// 但如果他不是真的string,那么也不会报错,只是没有length这个属性而已。
const str = input as string;
if (str.length){
return str.length
} else {
// 来到这里就会把它看作number类型。
const number = input as number
return number.toString().length;
}
}
// 使用类型守卫
function getLength2(input:string | number): number {
if (typeof input === 'string'){
return input.length
} else {
return input.toString().length
}
}