TS: 类型断言

2024-06-15 16:44
文章标签 类型 ts 断言

本文主要是介绍TS: 类型断言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例:


function useFetch() {
    const name: string = "跳跳";
    const age: number = 18;
    return [name, age] as const;
    }
//这里如果不使用 as const 会发现 我们结构出来的数组类型是name: string | number
// 使用完 as const 以后 为string,as const 也叫类型断言

问:


function useFetch() {
    const name: string = "跳跳";
    const age: number = 18;
    return [name, age] as const;
    }
//这里如果不使用 as const 会发现 我们结构出来的数组类型是name: string | number
// 使用完 as const 以后 为string,as const 也叫类型断言
useFetch()这里的 as const是什么?

回答:

在上述代码中,as const 是 TypeScript 中的类型断言语法,用于告诉编译器将一个值作为字面量类型进行推断。在这个特定的例子中,as const 被用于返回了一个元组类型的数组。

当不使用 as const 时,name 和 age 的类型会被推断为 string | number,这是因为 TypeScript 会根据赋值语句的右侧值的类型进行推断,并将其应用于变量的类型。在这种情况下,等号右边的值是一个由 string 和 number 类型构成的数组,因此 TypeScript 推断出 name 和 age 可以是 string 或 number 类型的联合类型。

然而,通过使用 as const,我们告诉 TypeScript 将返回的数组视为不可变的常量(const),并且要将其中的每个元素的类型也视为字面量类型。这样,name 和 age 就被正确地推断为 string 和 number 类型,而不是联合类型。

总结来说,as const 的作用是将一个表达式的类型断言为其整体字面量类型,从而避免出现联合类型。这在需要确保类型的精确性和确定性时非常有用

问:

不是太懂 什么是联合类型 为什么一定要用as const 这里的const指的什么?

回答:

联合类型是 TypeScript 中一种表示一个值可以是多种类型之一的方式。比如,如果一个变量可能是 string 或 number 类型,你可以使用联合类型来表示这一点:

```typescript
let myVar: string | number;
```

这样声明的变量 myVar 就可以存储 string 类型或者 number 类型的值。

在你的代码中,如果不使用 as const,TypeScript 会根据返回的数组推断出 name 和 age 的类型是 string | number,因为 TypeScript 会将元组中的每个元素都视为联合类型的候选项。

而当你使用 as const 时,你告诉 TypeScript 将返回的数组视为不可变的常量(const),并且要将其中的每个元素的类型也视为字面量类型。这样,name 和 age 就会被正确地推断为字面量类型,而不是联合类型。

所以,as const 这里的 const 指的是将数组中的元素作为字面量类型来对待,而不是联合类型。这样可以确保返回的数组中的元素类型是确定的,而不是多种可能性的联合类型

问:

所以类型断言的写法就是as const吗?

回答:

`as const` 是 TypeScript 中的一种特殊的类型断言,用于将一个值的类型推断为其字面量类型和只读属性。它可以用于确保对象、数组等结构在类型系统中被视为不可变和精确的类型。在你的示例中,`as const` 确保了返回的元组类型是 `[string, number]`,而不是更宽泛的 `(string | number)[]`。

不过,`as const` 并不是唯一的类型断言方式。TypeScript 还有其他类型断言语法,可以更灵活地处理类型转换。这些断言通常用于告诉编译器你比它更了解特定值的类型。

### 常见的类型断言语法

1. **尖括号语法** (不推荐在 JSX 中使用,因为会与 JSX 语法冲突):

```type
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
```

2. **`as` 语法**(推荐使用):

```typescript
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
```

### `as const` 的具体用途

`as const` 用于将一个对象、数组或其他结构转变为字面量类型,并使其不可变。来看一个具体的例子:

```typescript
const myArray = [10, 20] as const;
```

在这个例子中,`myArray` 的类型将被推断为 `[10, 20]`,而不是 `(number | number)[]` 或 `number[]`。这意味着 `myArray` 是一个包含两个具体数值(10 和 20)的元组,并且这些数值是只读的,不可更改。

### 更详细的例子

```typescript
function useFetch() {
    const name: string = "跳跳";
    const age: number = 18;
    return [name, age] as const;
}

// 调用 useFetch 并解构结果
const [name, age] = useFetch();

// 在这个例子中,name 和 age 的类型分别是 "跳跳" 和 18,而不是 string 和 number。
```

在这个例子中,`as const` 确保 `useFetch` 返回的数组被视为一个具体的字面量类型 `[string, number]` 的元组,而不是一个任意的 `(string | number)[]` 数组。

### 总结

- **`as const`**: 用于将一个表达式的类型断言为其字面量类型,使其不可变。
- **类型断言 (`as` 或 `<...>`)**: 用于告诉 TypeScript 一个值的确切类型,从而覆盖默认的类型推断。

希望这些解释能帮助你更好地理解 `as const` 和其他类型断言的用法。如果还有其他问题,欢迎继续提问!

问:

所以上面的useFetch函数中的 name和age是只读的是吗?

回答:

是的,当你在 `useFetch` 函数中使用 `as const` 时,返回的元组中的元素(即 `name` 和 `age`)会被视为字面量类型,并且是只读的。

为了更清楚地说明这一点,我们可以看一下 TypeScript 是如何处理 `as const` 的:

```typescript
function useFetch() {
    const name: string = "跳跳";
    const age: number = 18;
    return [name, age] as const;
}

// 调用 useFetch 并解构结果
const [name, age] = useFetch();
```

在这个例子中,`useFetch` 返回的是一个 `[string, number]` 类型的元组,并且每个元素都是只读的。换句话说,`name` 和 `age` 的值不能被改变:

```typescript
const result = useFetch();
// result 的类型是 readonly ["跳跳", 18]

const [name, age] = result;
// name 的类型是 "跳跳"
// age 的类型是 18

// 试图修改 name 或 age 的值将导致编译错误
// name = "新的名字"; // 错误: Cannot assign to 'name' because it is a read-only property.
// age = 20;         // 错误: Cannot assign to 'age' because it is a read-only property.
```

所以,使用 `as const` 不仅确定了返回数组中的元素类型是字面量类型,还确保了这些元素是不可变的,即只读的。

### 深入理解 `readonly`

返回的数组实际上是一个包含只读属性的元组,实际上是`Readonly<[string, number]>`。这意味着不仅数组本身是只读的,数组内的元素也是只读的。

### 总结

- 使用 `as const` 会将数组或对象的类型断言为不可变的字面量类型。
- 在函数 `useFetch` 中,返回的元组 `[name, age]` 被视为只读的字面量类型,因此你不能修改它们的值。

这种做法在一些需要确保数据不被意外修改的场景中非常有用,比如 Redux 状态管理中的不可变状态。希望这个解释能帮助你更好地理解 `as const` 的作用和用途!

这篇关于TS: 类型断言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064007

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1