ts中Omit损失类型问题

这篇具有很好参考价值的文章主要介绍了ts中Omit损失类型问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当Omit剔除的ts本身包含任意键即[key: string],则Omit的类型会丢失其余属性的类型

示例如下:

interface Base {
    data: string[]
    date: [string, string]
    [key: string]: unknown
}
type a = Omit<Base, 'data'> 
type b = a["date"]

此时剔除属性data,预期应当获得类型date与任意键值类型接收,即date可以获得[string, string]的类型提示,但实际a的类型为

// 我们预期的类型
type a = {
    date: [string, string]
    [key: string]: unknown
}

// 实际上获得的类型
type a = {
    [x: string]: unknown;
    [x: number]: unknown;
}

但此时我们去掉 [key: string]类型,结果就符合预期了

interface Base {
    data: string[]
    date: [string, string]
}
type a = Omit<Base, 'data'> 

// 	此时a的符合预期,为剔除属性后的结果
type a = {
    date: [string, string];
}

实际上的原代码大致如下,因为CommonComponents当中的[key: string]: any导致ChartProps无法获得正确类型

解决方案:去掉CommonComponents当中的[key: string]: any

问题原因:问题出在使用 Omit 类型操作符时对带有索引签名(如 [key: string]: unknown)的接口进行操作。TypeScript 在处理带有索引签名的接口时,会将索引签名视为一种更加通用的类型。因此,当你尝试从该接口中剔除某个属性时,TypeScript 会为了保持一致性而将其他属性的类型也更改为索引签名指定的类型。

在你的示例中,Base 接口包含一个索引签名 [key: string]: unknown,这意味着它可以接收任意类型的键值对。当你使用 Omit<Base, 'data'> 时,TypeScript 会将 date 属性的类型也更改为 unknown,以保持一致性。因此,获得的类型与预期不符。

结论:被继承的基础接口类型应当避免使用[key: string]: any,以避免产生后续类型提示上的问题

export interface CommonComponents {

    key: string

    label?: string

    // [key: string]: any
}


export interface CardComponents extends CommonComponents {
    // 省略
}


export interface CardProps extends CardComponents {
    // 省略
}


export type ChartProps = Omit<CardProps, 'data'> & {
    data?: string[][]
}

另一种解决方案:文章来源地址https://www.toymoban.com/news/detail-516351.html

type OmitIndex<T, K extends keyof T> = {
  [P in keyof T as Exclude<P, K>]: T[P];
};

interface Base {
  data: string[];
  date: [string, string];
  [key: string]: unknown;
}

type a = OmitIndex<Base, 'data'>;
type b = a['date'];

到了这里,关于ts中Omit损失类型问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【TypeScript】TS条件类型(十)

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源

    2023年04月11日
    浏览(46)
  • 【TypeScript】TS类型断言-类型的声明和转换(五)

    🐱个人主页: 不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📝个人签名:不破不立 📢资料领取:前端进阶资料以

    2024年02月22日
    浏览(39)
  • TypeScript基础篇 - TS日常类型 上篇

    目录 TS的常见用法介绍  example01.ts 逃避类型检查:any 思考一下~:不知道类型 类型标注 函数(参数和返回值) 匿名函数 TS如何知道匿名函数的类型? TS是一种标注式语言,不侵入JS的设计 文章内容 基础类型、数组 any/unkown 类型标注 函数 对象类型 联合 别名 接口 断言 字面

    2024年02月16日
    浏览(59)
  • 【TypeScript】TS接口interface类型(三)

    一、前言 TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。这些方法都应该是抽象的,需要由具体的类去实现,然后第三方

    2024年02月14日
    浏览(46)
  • 前端TypeScript学习day01-TS介绍与TS部分常用类型

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持?  TypeScript 相比 JS 的优势  TypeScript 初体验  安装编译 TS 的工具包 编译并运行 TS 代码 简化运行 TS

    2024年02月08日
    浏览(39)
  • 前端TypeScript学习day02-TS常用类型

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 TypeScript 常用类型 接口  元组  类型推论 类型断言 字面量类型 枚举 any 类型 typeof  当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到

    2024年02月08日
    浏览(52)
  • 前端TypeScript学习day03-TS高级类型

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)            目录 TypeScript 高级类型 class 类 class继承  extends implements  类成员可见性  public  protected  private   readonly 兼容性 类型兼容性 接口兼容性  函数兼容性  TypeScri

    2024年02月08日
    浏览(37)
  • vite 生成 TypeScript 的类型定义( d.ts )

    核心是 emitDeclarationOnly , declarationDir , declaration 也可以通过 tsc 命令 传入这些参数, 生成 d.ts

    2024年02月14日
    浏览(42)
  • 面试题-TS(一):TypeScript是什么?它与JavaScript有什么区别?

    面试题-TS(一):TypeScript是什么?它与JavaScript有什么区别? TypeScript是一种编程语言,它是JavaScript的超集。它通过添加静态类型、类、接口和模块等功能来扩展JavaScript。 JavaScript是一种广泛应用于Web开发的脚本语言,它的灵活性和易用性使得它成为了开发者们的首选。然而,Jav

    2024年02月15日
    浏览(50)
  • 【Ts之Omit 排除属性】

    FlatListDemo的props需要传入arr,和 需要渲染的renderItem,需要排除data属性 app.tsx中使用

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包