当前位置: 首页 > 知识库问答 >
问题:

typescript - 遇到一个 ts 的问题,有更优雅的解决方案吗?

王翰墨
2024-01-24

要求:尽量充分的利用类型推导,而不用额外写一写奇奇怪怪的东西。

问题点:

  1. func(str) 有正常的类型推导,很完美;
  2. func(obj.bbb) 为什么不能像前者一样?
type VmsType = "2D" | "3D" | "lpo" | "lips";function func(type: VmsType) {  console.log("�� ~ func ~ type:", type);}const str = "2D";const obj = { bbb: "2D" };// okfunc(str);// Argument of type 'string' is not assignable to parameter of type 'VmsType'.func(obj.bbb);

image.png

我知道可以下面两种办法:

  1. 类型断言(Type Assertion)

    func(obj.bbb as VmsType)
  2. 类型声明

    const obj: { bbb: VmsType } = { bbb: "2D" };

我想知道有没有更好的办法?

共有4个答案

郭志泽
2024-01-24

对于obj的类型推断没有那么严格,只需要加强约束 就行了

const obj = { bbb: "2D" } as const;

锺博耘
2024-01-24

试试

const obj = Object.freeze({ bbb: "2D" });
汪才英
2024-01-24

可以给obj添加上类型,这样ts就能推倒出其中属性类型:

type ObjType = {    bbb: VmsType}const obj: ObjType = { bbb: '2D' }// 此处就不会有ts报错了func(obj.bbb)
赵永新
2024-01-24

因为 const str = '2D' 定义的是一个常量,不可能被修改,所以 str 的类型能自动推断为 '2D'
const obj = { bbb: '2D' } 中的 bbb 是一个可变成员, 所以只能往泛类型上推导成 string

这种场景最好用枚举

enum VmsType {    '2D' = '2D',    '3D' = '3D',    lpo = 'lpo',    lips = 'lips'}function func(type: VmsType) {  console.log("�� ~ func ~ type:", type);}const str = VmsType["2D"];const obj = { bbb: VmsType["2D"], ccc: 'test' };// okfunc(str);func(obj.bbb);// Argument of type 'string' is not assignable to parameter of type 'VmsType'.func(obj.ccc);
 类似资料:
  • 本文向大家介绍Ubuntu16.04.4LTS安装mininet遇到的问题及解决方案,包括了Ubuntu16.04.4LTS安装mininet遇到的问题及解决方案的使用技巧和注意事项,需要的朋友参考一下 Mininet Mininet 是一个轻量级软件定义网络和测试平台;它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统和用户代码,也可简单理解为 SDN 网络系统中的

  • 本文向大家介绍struts升级到2.5.2遇到的问题及解决方案(推荐),包括了struts升级到2.5.2遇到的问题及解决方案(推荐)的使用技巧和注意事项,需要的朋友参考一下 原来的版本是2.3.x,由于安全原因需要升级到2.5.2。 1,2.5.2版本不再提供xwork.jar ,整合到了 struts-core包中。 2,方法不能访问的问题,需要在每个action配置文件中加上 strict-

  • 本文向大家介绍node连接mysql数据库遇到的问题和解决方案,包括了node连接mysql数据库遇到的问题和解决方案的使用技巧和注意事项,需要的朋友参考一下 今天安装了新版的MySQL(8.0.21),用node框架连接数据库的时候报了个错: Client does not support authentication protocol requested by server; consider

  • 我在这里编写了一个Python解决方案,它解决了以下问题:如何用最少数量的给定面额的硬币来制造给定数量的货币? 虽然我的解决方案有效,但当大于50或的长度大于5时,需要很长时间。我怎样才能加快代码的速度,使其能够在相当大的输入下工作?我是否错过了一个技巧或其他可以大大加快代码速度的东西?

  • 当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour

  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18