类型推论
如果没有明确指定类型,那么TypeScript会依照类型推论的规则推断出一个类型。
-
声明了一个变量但是没有定义类型
-
声明变量没有定义类型也没有赋值,TS会推断成any类型
类型断言
类型断言有两种写法:
- 尖括号写法
语法: <类型>值 value
interface A {
run: string
}
interface B {
build: string
}
const fn = (type: A | B): string => {
return (<A>type).run
}
//可以使用类型断言来推断他传入的是A接口的值
- as 写法
语法: 值 as 类型 value as string
interface A {
run: string
}
interface B {
build: string
}
const fn = (type: A | B): string => {
return (type as A).run
}
类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误
非空断言
在上下文种当类型检查器无法断定类型时,可以使用缀表达式操作符 **!**进行断言操作是非null和非undefined的类型,即x!的值不会为null 或 undefined
let user:string | null | undefined;
console.log(user!.toUpperCase()); //编译正确
console.log(user.toUpperCase()); //error
确定赋值断言
定义了变量, 没有赋值就使用,则会报错
通过 let x!: number; 确定赋值断言,TypeScript 编译器就会知道该属性会被明确地赋值。
let value: number
console.log(value) //error
let value!:number
console.log(value); //undefined 编译正确
使用any临时断言
window.abc = 123 // error
//因为window没有abc
(window as any).abc = 123 //编译正确
// 可以使用any临时断言在 any 类型的变量上,访问任何属性都是允许的。
联合类型
联合类型用|分隔,表示取值可以为多种类型中的一种
let status: string|number
status = '12321'
status = 12321
//函数使用联合类型
const fn = (something:number | boolean):boolean => {
return !!something
}
类型别名
type 关键字(可以给一个类型定义一个名字)多用于复合类型
定义类型别名
- 定义类型别名
let str = string
let s:str = '张三'
- 定义函数别名
type str = () => string
let s:str = () => 'zhangsan'
- 定义联合类型别名
type str = string | number
let s: str = 123
let s2: str = '123'
- 定义值的别名
type value = boolean | 0 | '123'
let s: value = true
//变量s的值 只能是上面value定义的值
type 和 interface 还是一些区别的 虽然都可以定义类型
- interface可以继承 type 只能通过 & 交叉类型合并
- type 可以定义 联合类型 和 可以使用一些操作符 interface不行
- interface 遇到重名的会合并 type 不行
交叉类型
交叉类型就是跟联合类型相反,用&操作符表示,交叉类型就是两个类型必须存在
interface People {
name: string,
age: number
}
interface Man{
name: string,
gender: string
}
let zhangsan = (man: People & Man) => {
console.log(man.name)
console.log(man.age)
console.log(man.gender)
}
zhangsan({name: 'zhangsan',age: 18,gender: 'male'});
注意:交叉类型取的多个类型的并集,但是如果key相同但是类型不同,则该key为never类型
interface PersonA {
age: string
}
interface PersonB {
age: number
}
function test(params: PersonA & PersonB){
console.log(params);
}
test({age: '18'}) //编译错误 Type 'string' is not assignable to type 'never'.