Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在创建一个更复杂的类型时,如何避免代码重复,该类型使用与Typescript中超集类型相同的道具?

在创建一个更复杂的类型时,如何避免代码重复,该类型使用与Typescript中超集类型相同的道具?
EN

Stack Overflow用户
提问于 2019-03-06 17:31:33
回答 1查看 23关注 0票数 0

我有两个使用"props“的数据结构,其中一种类型的prop更简单,另一种类型的prop更复杂。简单的道具类型用于“元素”,复杂的道具类型用于“组件”。

这是一个简单的数据结构:

代码语言:javascript
运行
AI代码解释
复制
export interface IPageElementProps {
  maxContainerWidth: number
}

export interface ITextElementProps {
  text: string
  styleRanges: ICanvasTextElementStyleRange[]
}

然后复制其中的每一个,以允许组件的属性使用更复杂的数据结构:

代码语言:javascript
运行
AI代码解释
复制
export interface IPageComponentProps {
  maxContainerWidth: IComponentProp<number>
}

export interface ITextComponentProps {
  text: IComponentProp<string>
  styleRanges: IComponentProp<ICanvasTextElementStyleRange[]>
}

/**
 * A component property defines whether a property is injectable (dynamic)
 * or whether it is hardcoded within the component (non-dynamic or static).
 */
export interface IComponentProp<T> {
  dynamic: boolean
  value?: T
  defaultValue?: T
}

我倾向于使用泛型类型参数,而不必重新定义每种类型的元素/组件(一种用于简单数据结构,另一种用于复杂数据结构)。大致是这样的:

代码语言:javascript
运行
AI代码解释
复制
export interface IPageProps<T = undefined> {
  maxContainerWidth: T<number>
}

然后,我将简单类型用作简单props: IPageProps,将其用于复杂类型作为props: IPageProps<IComponentProp>

这有意义吗? Typescript中有这样的功能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 17:44:08

您可以创建一个新的泛型类型,它将为您完成此操作。新类型将遍历给定类型的所有属性,并将每个属性“转换”为IComponentProp

如下所示:

代码语言:javascript
运行
AI代码解释
复制
export interface IPageElementProps {
  maxContainerWidth: number;
}

export interface ITextElementProps {
  text: string;
  styleRanges: ICanvasTextElementStyleRange[];
}

export interface IComponentProp<T> {
  dynamic: boolean;
  value?: T;
  defaultValue?: T;
}

// This is the magic type
type PageProps<T> = { [P in keyof T]: IComponentProp<T[P]> };

// There new types will do the job
type IPageComponentProps = PageProps<IPageElementProps>;
type ITextComponentProps = PageProps<ITextElementProps>;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55029008

复制
相关文章
Typescript中的复杂类型声明
Typescript为javascript加入了众多类型声明语法,灵活使用可使代码变得健壮,不严谨的类型声明会带来后期的维护麻烦。本篇假设读者已经学会ts的基础类型声明语法,包括type、interface、extends和泛型,在此基础上,聊一聊一些更加复杂的类型声明场景以及解决办法。
腾讯IVWEB团队
2020/06/28
7.3K1
TypeScript中的类型
基本类型布尔类型 (boolean)布尔类型表示一个值为真或假的逻辑值。let isDone: boolean = false;数字类型 (number)数字类型表示整数或浮点数。let count: number = 10;let price: number = 3.99;字符串类型 (string)字符串类型表示一串字符。let message: string = "Hello, TypeScript!";数组类型 (array)数组类型表示一个元素的集合。let numbers: number[] =
堕落飞鸟
2023/05/22
2K0
TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型
TypeScript 是一种由微软开发的静态类型编程语言,它是 JavaScript 的超集,并且可以在编译时进行类型检查。TypeScript 强大的类型系统使得开发者能够更轻松地编写可维护、可扩展的代码。本文将详细介绍 TypeScript 中的基础类型,包括原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型。
网络技术联盟站
2023/07/06
1.1K0
TypeScript中的类型断言
本文是关于 TypeScript 中的 type assertions 的,它与其他语言中的类型强制转换有相似之处,并通过 as 运算符执行。
疯狂的技术宅
2020/06/19
3.9K0
去除typescript代码类型
在短时间内有一个需求,原项目代码是 js,而我手里头的功能代码是 ts 的,需要将其合并。
愧怍
2022/12/27
2.7K0
索引类型、映射类型与条件类型_TypeScript笔记12
P.S.注意,不同于typeof面向值,keyof是针对类型的,而不是值(因此keyof obj不合法)
ayqy贾杰
2019/06/12
1.7K0
实现TypeScript中的互斥类型
有这样一个对象,它有两个属性:name与title,在赋值的时候这两个属性只有一个能出现,例如:name出现的时候title就不能出现,title出现的时候name就不能出现。
神奇的程序员
2022/04/11
3.2K0
实现TypeScript中的互斥类型
组合类型与类型保护_TypeScript笔记9
Object.assign能把source: U身上的可枚举属性浅拷贝到target: T上,因此返回值类型为T & U
ayqy贾杰
2019/06/12
1.6K0
TypeScript 中的数组类型定义
在 TypeScript 中声明和初始化数组也很简单,和声明数字类型和字符串类型的变量也差不多,只不过在指定数组类型时要在类型后面加上一个中括号 []
Qwe7
2022/03/19
5.5K0
TypeScript函数的类型
函数声明 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression): 函数声明(Function Declaration)
conanma
2021/12/07
2.1K0
TypeScript中的高级类型工具类型及关键字
本文主要帮助理解 TypeScript 中的高级类型及工具类型。在实际使用 TypeScript 的开发过程中,得益于这些高级类型于工具类型,我们可以更方便的构建出我们需要的类型。
路过的那只狗
2020/11/13
2.1K0
如何在TypeScript中使用类型保护
类型保护是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。类型保护具有唯一的属性,可以确保测试的值是根据返回的布尔值设置的类型。
前端修罗场
2023/10/07
3170
TypeScript 在 Vue2 中的类型声明问题
最近在一个新项目中,尝试了vue2+typescript的组合,碰到一个问题,在data属性中,我怎么声明一个变量的类型。
2022/02/25
4.8K0
.NET中的值类型与引用类型
这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别?
AI.NET 极客圈
2019/08/09
1.9K0
TypeScript 类型注解和类型推断
当不添加类型注解时,TypesScript 也能知道变量 a 是一个数字,这就是 TypeScript 的类型推断:
Leophen
2020/07/23
1.2K0
03-TypeScript中的强类型
在js中不能定义类型,而是根据赋值后,js运行时推断类型。在ts中支持强类型,强类型包括string、number(浮点型,不是整型)、boolean、any(任意类型)、Array<T>、自定义类型(枚举、类等) 除了能给变量申明为强类型,参数也可以申明为强类型,方法也可以定义返回类型,方法如果没有返回值,定义为void类型。 var username:string; var age:number; var descrption:any; var isman:boolean; var schools:Ar
用户1910585
2018/05/04
1.9K0
在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Model类型或者字段/属性上应用相应的ValidationAttribute。但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上——即使我们将AllowMultiple属性设置为True。这篇文章的目的就是为了解决这个问题。[源代码从这里下载] 一、一个自定义ValidationAttribute:Ran
蒋金楠
2018/02/07
2.2K0
在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
TS 类型体操:图解一个复杂高级类型
之前我们零散地了解了一些 TypeScript 类型体操的套路,但是没有综合练习下,今天就来做个高难度的体操,它会综合运用模式匹配、构造、递归等套路,对提升类型编程水平很有帮助。
神说要有光zxg
2022/03/03
5280
TS 类型体操:图解一个复杂高级类型
点击加载更多

相似问题

Typescript -如何避免在类型数组上重复相同的属性?

167

如何在Typescript中正式创建超集的子集类型?

217

在TypeScript中使用映射类型时更严格的联合类型

12

返回类型与TypeScript中的输入类型相同

41

如何使用代码优先方法在graphql中创建更复杂的类型

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档