TS 类型断言

Typescript允许你覆盖它的判断,并且能以任何你想要的方式分析它,这种机制被称为类型断言。

类型断言的两种方式:

1.as关键字

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig) {
  // ...
}

let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);

2.尖括号<>

let someValue: any = 'this is a string'
let strLength: number = (<string>someValue).length

一般情况建议使用as关键字来断言,尖括号断言在jsx中会有歧义,因此建议统一使用as。

注意:

类型断言只能够欺骗typescript编译器,无法避免运行时的错误。

类型断言和类型转换对比

类型断言只会影响typescript编译时的类型,类型断言在编译结果中会被删除。上述代码经过typescript编译后会变成:

let someValue = 'this is a string'
let strLength = someValue.length

而类型转换会改变变量的值:

let someValue: any = 'this is a string'
let strLength: number = (<string>someValue).length  // 类型断言
let someValue2 =  Boolean(someValue) // 类型转换

// someValue2 => true

类型断言和类型声明对比:

注意优先使用类型声明,代码更优雅,代码质量高

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): SquareConfig{
  // ...
  return config
}

// 类型声明
const mySquare: SquareConfig = createSquare({ width: 100 });

// 类型转换
const mySquare2 = createSquare({ width: 100}) as SquareConfig

### 类型断言 类型断言是TypeScript中一种显式地告诉编译器某个值的实际类型的方式,它不会进行任何运行时的类型检查或转换,而仅仅是在编译时为变量提供一个类型注解,是一个编译时语法,旨在帮助开发者更好地利用TypeScript的类型系统。当开发者比TypeScript更了解某个值的详细信息时,可使用类型断言告诉编译器如何理解这个值,它好比其他语言里的类型转换,但不进行特殊的数据检查和解构,没有运行时的影响,只在编译阶段起作用[^3][^4][^5]。 类型断言有两种形式: - “尖括号” 语法: ```typescript let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length; ``` - “as” 语法: ```typescript let someValue: any = "this is a string"; let strLength: number = (someValue as string).length; ``` ### 类型守卫 类型守卫用于在运行时检查某个值的类型,从而缩小类型范围,增加代码的类型安全性和灵活性。常见的类型守卫方式有: - `typeof` 操作符进行类型守卫:用于区分原始数据类型,示例如下: ```typescript function printValue(value: string | number) { if (typeof value === 'string') { console.log(value.toUpperCase()); } else { console.log(value.toFixed(2)); } } ``` - `instanceof` 操作符进行类型守卫:用于类的类型判断,示例如下: ```typescript class Animal { makeSound() { console.log('Some sound'); } } class Dog extends Animal { bark() { console.log('Woof!'); } } function performAction(animal: Animal) { if (animal instanceof Dog) { animal.bark(); } else { animal.makeSound(); } } ``` ### 类型断言类型守卫的区别 类型断言是编译时语法,仅在编译阶段起作用,不会改变变量的运行时值,只是告诉编译器如何理解这个值;而类型守卫是运行时检查,用于在运行时确定某个值的类型,从而缩小类型范围,保证代码在运行时的类型安全性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值