Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >它可以是强类型的吗?

它可以是强类型的吗?
EN

Stack Overflow用户
提问于 2019-01-21 17:48:05
回答 1查看 41关注 0票数 1

我正在尝试在Typescript中实现一种伪模式匹配,利用它们对区分联合的支持,利用匹配函数和表示匹配表达式分支的对象。

以下是我希望能够使用的场景:

代码语言:javascript
运行
AI代码解释
复制
type Shape = 
    | { kind: 'Circle', radius: number }
    | { kind: 'Rectangle', height: number, width: number }

function printShape(s: Shape) {
    return document.write(
        match(s, {
        'Circle': c => `Circle(${c.radius})`,
        'Rectangle': r => `Rectangle(${r.width} x ${r.height})`
    }));
}

我现在尝试定义match函数,如下所示:

代码语言:javascript
运行
AI代码解释
复制
function match<T extends { kind: V }, V extends string, R>(
    x: T, branches: { [P in T['kind']]: (arg: T & { 'kind': P }) => R }) {

    return branches[x.kind](x);
}

这很接近,但不幸的是,这并不能很好地工作;虽然我已经成功地让编译器抱怨给定匹配的完整性,但分支函数的参数类型不是很好:参数cr的类型为any

我可以使用kind作为硬编码的鉴别器,但是我通常不理解如何在Typescript中过滤出泛型类型联合的可能性。例如,我将我的练习提炼为尝试编写以下代码:

代码语言:javascript
运行
AI代码解释
复制
type Where<T, K extends keyof T, V extends T[K]> = ???

我的类型约束是正确的,因为当我编写以下代码时,我从编译器获得了关于类型和文字的正确验证:

代码语言:javascript
运行
AI代码解释
复制
type Circle = Where<Shape, 'kind', 'Circle'>

但是我不明白我可以在类型表达式的右边写什么来返回:

代码语言:javascript
运行
AI代码解释
复制
{ kind: 'Circle', radius: number }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-21 18:01:53

要从联合中提取特定类型,可以使用Extract条件类型。这将提取作为第二个参数的子类的所有联合成员。因此,where类型将如下所示:

代码语言:javascript
运行
AI代码解释
复制
type Where<T, K extends keyof T, V extends T[K]> = Extract<T, Record<K, V>>
type C = Where<Shape, 'kind', 'Circle'> //{ kind: 'Circle', radius: number }

如果使用返回函数的函数,则可以获得该函数的完整类型。第一个调用设置T,第二个调用可以使用类型信息来完整地键入参数:

代码语言:javascript
运行
AI代码解释
复制
type Shape =
  | { kind: 'Circle', radius: number }
  | { kind: 'Rectangle', height: number, width: number }

function printShape(s: Shape) {
  var r = match(s)({
    'Circle': c => `Circle(${c.radius})`,
    'Rectangle': r => `Rectangle(${r.width} x ${r.height})`
  }) // r is string
  return document.write(r);
}


function match<T extends { kind: V }, V extends string>(x: T) {
  return function <R>(branches: { [P in T['kind']]: (arg: Extract<T, { 'kind': P }>) => R }) {

    return branches[x.kind](x as any);
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54295322

复制
相关文章
通俗的方式理解动态类型,静态类型;强类型,弱类型
引言 今天和一个朋友讨论 C++ 是强类型还是弱类型的时候,他告诉我 C++ 是强类型的,他和我说因为 C++ 在写的时候需要 int,float 等等关键字去定义变量,因此 C++ 是强类型的,我告诉他 C++ 是弱类型的他竟然还嘲笑我不懂基础。 我又尝试去问了另外一个同学 Python 是强类型还是弱类型的时候,得到的竟然是弱类型,就因为定义变量没有 int,float! 然后我想找一些网上的资料试图告诉他们他们是错的(我是对的),结果发现网上的资料大多为了严谨结果把简单的问题(其实并不简单)说的很
桃翁
2018/06/27
2.3K0
区块链是今年的流行词 - 但它可以超越炒作吗?
比特币背后的开源账本被吹捧为从银行到健康的一切革命,但是判断还早。 围绕加密货币的猜测掩盖了这样一个事实:区块链是驱动比特币的分散的开源分类账,可以彻底改变所有权被验证的方式。 虽然主要加密货币的价值波动,但“区块链”仍然是一个利润丰厚的流行词,公司已经发现是一个吸引资金的磁铁。但是通过炒作,区块链技术真的可以彻底改变从银行到教育的任何方式吗? 区块链允许人们创造独立于第三方的数字财产,并以信念为基础记录所有权。带时间戳的数据条目只能追加并且始终可访问,部分原因是数据库存储在计算机网络中,而不是中央服务
架构师研究会
2018/04/09
7290
什么是强类型、弱类型、动态类型、静态类型语言
强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就死该数据类型。
JavaEdge
2021/02/22
7.5K0
什么是强类型、弱类型、动态类型、静态类型语言
强类型 JavaScript 的解决方案
JavaScript 是一种弱类型(或称动态类型)语言,即变量的类型是不确定的。 x = 5; // 5 x = x + 'A'; // '5A' 上面代码中,变量x起先是一个数值,后来是一个字符串,类型完全由当前的值决定,这就叫弱类型。 弱类型的好处是十分灵活,可以写出非常简洁的代码。但是,对于大型项目来说,强类型更有利,可以降低系统的复杂度,在编译时就发现类型错误,减轻程序员的负担。 一直有人尝试,让 JavaScript 变成强类型语言。在官方最终支持强类型之前,本文介绍三种现在就可
ruanyf
2018/04/12
9990
强类型 JavaScript 的解决方案
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
弱类型、强类型、动态类型、静态类型语言的区别是什么
语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.
用户8442333
2021/12/01
1.5K0
ReasonML——新的前端强类型语言简介
从有前端到现在,JavaScript 语言一直都是实现前端逻辑的首选。但是,由于 JavaScript 是一个弱类型语言,很难进行相关的类型检测。因此在构建大型应用时,使用 JavaScript 难免会遇到一些隐式类型转换等相关的问题,从而导致程序的 bug。
黄Java
2019/03/13
1.8K0
java中的引用类型:强软弱虚
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
炒香菇的书呆子
2023/10/10
1850
每日一问06 构造函数可以是虚函数吗
https://www.bilibili.com/video/BV1Kb411B7N8
早起的鸟儿有虫吃
2021/01/05
7220
每日一问06 构造函数可以是虚函数吗
Python「强类型」or「弱类型」?90% 的人说不清
类型检查是一个验证和施加类型约束的过程,编译器或解释器通常在编译或运行阶段做类型检查。例如,你不能拿一个string类型值除以浮点数。
double
2019/11/04
3.4K0
int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值。不过注意:Nullable<T> 本身也是个 struct,是个值类型哦。这意味着你随时可以调用 .HasValue 这样的方法,而不用担心会出现 NullReferenceException。
walterlv
2020/02/10
1.5K0
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
这篇文章综合介绍了四种分类,特别地,为了方便大家快速有效的学习,笔者尝试用思维导图的办法描述编程语言的区别。一般来讲,看第一个图就够了。但如果你想更深入地了解,也可以参考下面的文字表述。
陈满iOS
2018/09/10
10K1
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
强类型与弱类型语言关于存取对象(数据)的问题
在旧的业务流程加入一个“拦截”,原来从前端表单提交到后台的处理逻辑延后处理,本质上是一个异步化的处理过程。 此时将表单参数存储到数据库,在适当的时刻“拦截”结束通过时调用原来的处理逻辑。 F代表表单参数,A代表控制器参数,
用户3579639
2018/10/22
8810
强类型与弱类型语言关于存取对象(数据)的问题
C++11强类型枚举
枚举类型是C/C++中用户自定义的构造类型,它是由用户定义的若干枚举常量的集合。枚举值对应整型数值,默认从0开始。比如定义一个描述性别的枚举类型。
恋喵大鲤鱼
2019/01/03
3.2K0
强类型 JavaScript方案 Typescript & flow
TypeScript 是微软2012年推出的一种编程语言,属于 JavaScript 的超集,可以编译为 JavaScript 执行。 它的最大特点就是支持强类型和 ES6 Class。
javascript.shop
2019/09/04
9790
细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型
  在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序。通过Projection我们可以选择库表中部分列、也可以增加
用户1150956
2018/01/05
1.6K0
java中定义常量_形参可以是表达式吗
如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,那么这将如何影响?
全栈程序员站长
2022/11/10
6000
使用强类型的Include显式预加载
Include(i=>i.SubEntity1.Select(j=>j.SubSubEntity1))
全栈程序员站长
2022/07/05
4450
都说vivo营销强,但你知道vivo的营销究竟强在哪里吗?
日前vivo和FIFA(国际足联)签下长达六年的合约,成为世界杯2017-2023年的官方赞助商,覆盖从2017年联合会杯到2022年卡塔尔世界杯比赛。在此之前,vivo在体育营销上已有诸多尝试,但这
罗超频道
2018/04/16
2.7K0
都说vivo营销强,但你知道vivo的营销究竟强在哪里吗?
java学习引用类型之强引用
在Java中,强引用(Strong Reference)是最常见、默认的引用类型。它是一种正常的对象引用,如果一个对象具有强引用与之关联,那么即使内存紧张,垃圾回收器也不会回收该对象。
高久峰
2023/07/14
1650

相似问题

ClickOnce更新位置-它可以是本地的吗?

20

CSS光标:它可以是半透明的图像吗?

23

Android状态栏-它可以是透明的吗?

46

它可以是非根目录控制器吗?

12

Firebase主题--它可以是用户订阅的用户ID吗?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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