TypeScript学习三(类型推论|类型断言|联合类型|类型别名|交叉类型)

类型推论

如果没有明确指定类型,那么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 还是一些区别的 虽然都可以定义类型

  1. interface可以继承 type 只能通过 & 交叉类型合并
  2. type 可以定义 联合类型 和 可以使用一些操作符 interface不行
  3. 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'.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值