Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从受约束的泛型参数提取数据属性名称

从受约束的泛型参数提取数据属性名称
EN

Stack Overflow用户
提问于 2020-09-18 01:36:05
回答 2查看 87关注 0票数 1

我们有一个泛型类型,它成功地从它接收的类型中提取数据属性。它是in the playground,它是这样工作的。

代码语言:javascript
运行
AI代码解释
复制
type DataPropertyNames<T> = {
  [K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];

type FooBarBaz = {
  foo: string;
  bar: Function;
  baz: number;
};

const f1 = () => {
  type DataProps = DataPropertyNames<FooBarBaz>;

  const x: DataProps = 'foo'; // good, no error, because foo is a string

  const y: DataProps = 'bar'; // good, expected error, because bar is a Function.

  return {
    x,
    y
  };
};

上面的例子展示了当我们向DataPropertyNames传递一个具体的类型,比如FooBarBaz时,它是如何工作的。正如预期的那样,它丢弃了属于函数的道具,并保留了非函数的道具。

我们的问题是,为什么下面的代码不能像预期的那样工作。我们预期DataProps会接受'foo'字符串,因为T扩展了FooBarBaz

代码语言:javascript
运行
AI代码解释
复制
const f2 = <T extends FooBarBaz>() => {
  type DataProps = DataPropertyNames<T>;

  const x: DataProps = 'foo'; // bad, unexpected error

  const y: DataProps = 'bar';

  return {
    x,
    y
  };
};

为什么TypeScript不能确定T至少与它扩展的类型具有相同的数据属性名称?我们如何才能让TypeScript相信这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-18 02:06:56

目前,TypeScript还没有成熟到可以通过复杂的定义解析泛型参数,并通过参数的约束来简化它;即使它可以,在您的例子中,结果也应该是类似unknown | 'foo' | 'baz'的东西,其中unknown是不可避免的,因为我们真的不知道T中有什么,这将简单地简化为unknown,这并不是真正有帮助的。

但对于您的特定情况,一种使其工作的方法是使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
type DataProps = DataPropertyNames<T> | DataPropertyNames<FooBarBaz>;

除非您的类型约束是另一个泛型参数,否则这应该可以满足您的需要。

票数 2
EN

Stack Overflow用户

发布于 2020-09-18 14:03:22

Mu-Tsan Tsai的答案是正确的,我只是想为了更清楚地说明简单的泛型类型是有效的。我一直对这种情况很好奇,我认为提供一个实验,让我们可以看到什么时候类型变得太复杂是很有用的。你可以使用下面的例子(通过playground链接),看看typescript的未来版本是否有所改善(我的实验是在TS4.0.2中运行的)。

在下面的代码中,当泛型T直接与扩展约束一起使用时,我们可以访问泛型约束中使用的类的属性。这是好的,也是意料之中的,这并不奇怪。当你有一个非常简单的带有T的泛型类型(basicGenType),它也可以工作,在我的例子中,我使用了keyof运算符,泛型类型能够从T中提取键。实际上,我对此感到有点惊讶,因为我认为当使用T作为泛型参数时,任何泛型类型都会失败。对于稍微复杂一点的基本类型(basicGenType2,basicGenType3),它会失败。似乎有一次我开始推断一个新的类型(在本例中是K),并用它来组合结果类型,这就是断点。一个有趣的观察是,智能感知会自动完成basicGenType2和basicGenType3的关键字段。

一旦我测试了扩展并推断它也失败了,这并不令人惊讶,它符合你的经验。

代码语言:javascript
运行
AI代码解释
复制
type basic = {simple:number}
type basicGenType<T> = keyof T
type basicGenType2<T> = {[K in keyof T]: K}
type basicGenType3<T> = {[K in keyof T]: T[K]}
type complexGenType1<T> = T extends basic ? number : never
type complexGenType2<T> = T extends {simple:infer R} ? R : never

const g = <T extends basic>(a:T):void => {

  //directly on T typescript can use the properties of basic
  a.simple = 5; //GOOD --typescript is good with this
  a.simple = "5" //GOOD -- typescript complains 
  a.other = 5;  //GOOD -- typescript complains

  //for a simple generic type typescript still works
  //the resulting type should only allow the value 'simple'
  type basicType = basicGenType<T>
  let b:basicType = 'simple'; //GOOD -- typescript is ok with this
  b = 'other'; //GOOD -- typescript complains

  //for a slightly more complicated simple type we fail
  // the resulting type should only allow the value {simple:'simple'}
  type basicType2 = basicGenType2<T>
  let b2:basicType2 = {simple:'simple'}; //BAD -- typescript fails even though it should be ok with this

   //for a slightly more complicated simple type we fail
  // the resulting type should only allow the value {simple:number}
  type basicType3 = basicGenType3<T>
  let b3:basicType3 = {simple:3}; //BAD -- typescript fails even though it should be ok with this

  //we've introduced extends here for complexity
  //complexType shoud resolve to number here
  type complexType1 = complexGenType1<T>;
  let c:complexType1 = 5;//BAD -- typescript fails even though it should be ok with this

  //we've introduced extends and infer here for even more complexity
  //complexType2 shoud resolve to number here
  type complexType2 = complexGenType2<T>;
  let d:complexType2 = 5;//BAD -- typescript fails even though it should be ok with this
}

Playground Link

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63948187

复制
相关文章
聊天机器人的挑战
大家好,这里是NewBeeNLP。今天来送基本书,《自己动手做聊天机器人》,感兴趣的同学文末参加噢!
NewBeeNLP
2022/11/11
8090
聊天机器人的挑战
TensorFlow 聊天机器人
该文章介绍了如何利用基于Seq2Seq模型进行机器翻译,包括编码器、解码器和注意力机制等方面的实现。同时,文章还提供了训练、预测和评估的代码示例。
MachineLP
2018/01/09
1.1K0
TensorFlow 聊天机器人
聊天机器人一
? ? ? ? ? ? ---- ?
拾点阳光
2019/03/13
1.1K0
聊天机器人一
图灵聊天机器人
01 目录 确定目标 分析目标 代码实操 02 确定目标 本次通过图灵机器人平台的API接口制作一个人工智障聊天机器人 图灵机器人的网址为:'http://www.turingapi.com/ '
佛系编程人
2019/08/14
1.7K0
图灵聊天机器人
聊天机器人总结
里面提到一个名词叫槽位。其实可以简单的理解为填表格。DPO发起询问,NLG生成回复,为了使得回复自然,这里采用推荐时的回复。
故事尾音
2019/12/18
1.1K0
聊天机器人总结
构建一个简单的 Google Dialogflow 聊天机器人【上】
本教程将向您展示如何构建一个简单的Dialogflow聊天机器人,引导您完成Dialogflow的最重要功能。您将学习如何:
磐创AI
2019/07/10
4.2K0
构建一个简单的 Google Dialogflow 聊天机器人【上】
导出Lync用户聊天记录
SQL存档数据库聊天记录日期是UTC,中国是UTC+8,也就是SQL存储数据库聊天记录记录日期比北京时间慢8小时。注意选择导出时间
杨强生
2019/03/05
1.1K0
Transformer聊天机器人教程
在这篇文章中,我们将演示如何构建Transformer聊天机器人。 本文聚焦于:使用TensorFlow Dataset并使用tf.data创建输入管道来使用Cornell Movie-Dialogs Corpus,使用Model子类化实现MultiHeadAttention,使用Functional API实现Transformer。
昱良
2019/05/29
2.4K0
Transformer聊天机器人教程
开启聊天机器人模式
聊天机器人系统框架图 今天看到了一篇关于聊天机器人的一个不错的资源汇总: https://www.52ml.net/20510.html 进去看看先大概了解了一下都有哪些主要的概念: 原文:巨头们都很重视的聊天机器人,你不进来看看吗? 理想的 chatbot 什么样 现在的 bot 什么样 |处理任务 |聊天-搞笑
杨熹
2018/04/03
9340
开启聊天机器人模式
聊天机器人API Demo
昨天车上无聊,又写起了代码…… 居然真写出了个聊天机器人的API Demo……(没啥用) 这个API是调用图灵机器人的官方API,只是简单的解析json,直接把文字信息输出 话不多说,上代码 <?ph
FHYC
2018/06/22
4.5K0
Google杀入AI聊天机器人领域,暴跌千亿?错哪了?
大家好,ChatGPT 现在被大家玩坏了,甚至在用户的不断逼问之下,露出了鸡脚,原来 ChatGPT 也是小黑子
AI算法与图像处理
2023/02/28
4360
Google杀入AI聊天机器人领域,暴跌千亿?错哪了?
开启聊天机器人模式
本文介绍了聊天机器人技术的研究进展,从系统框架、自然语言理解、对话管理、自然语言生成等方面进行了详细阐述,并对当前面临的挑战和未来的展望进行了分析。
MachineLP
2018/01/09
1.1K0
开启聊天机器人模式
聊天机器人模型 - ChatGPT
还有一个问题,正常情况:注册成功openai会赠送18美金,可以用于api调用。但如果你用的这个手机号被其他人用过了,这18美金就没有了。我第一次就遇到这个问题,只能换个E-mail重新注册
崔哥
2023/02/26
1.1K0
beego聊天室的基本配置
beego.Router("/ws", &controllers.WsController{})
公众号-利志分享
2022/04/25
2100
spring之配置单例的集合bean,以供多个bean进行引用
这种情况下,是在一个bean的里面进行配置的,假设现在我们有另外一个bean,也需要使用List集合里的bean,那么应该怎么做呢?
西西嘛呦
2020/08/26
3980
spring之配置单例的集合bean,以供多个bean进行引用
使用Python操作机器人聊天
萌新偶然发现一个好玩的东西 使用Python和机器人聊天 效果 工具 图灵机器人API itchat(提前安装) 准备 自己需要去图灵机器人注册账号,拿到APIkey,大家也可以直接使用我这个 ca0
小歪
2018/04/04
1.5K0
使用Python操作机器人聊天
Python实现聊天机器人
AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。
海天一树
2018/07/25
1.3K0
Python实现聊天机器人
简易聊天系统-聊天服务
聊天负责私人聊天,群组聊天。私人聊天接受信息后保存至数据库再转发给目标用户。群组聊天当前没有离线消息保存,也就是用户登录后无法知道多少消息未读,而是直接拉取指定数量群聊天。当有成员发送后会将聊天信息存储数据库(没有缓存进redis,因为在线用户会直接发送,目前没有这个优化必要),从redis中检索所有群组在线用户并通过消息队列发送至对应网关。
全栈程序员站长
2022/07/21
2.4K0
聊天机器人与Alice的AIML
聊天机器人从20世纪80年代起相继出现:TalkBot、Elbot、eLise、Alice、Laylahbot、爱情玩偶等,其中Alice曾被认为是最聪明的机器人。
Mshu
2018/10/31
2.6K0
如何让人类上瘾 浅谈聊天机器人抓住用户的艺术
在飞速发展的 AI 领域,聊天机器人极有可能是下一个风口。 在其核心,聊天机器人做的事情,是模拟与用户的双向通话。取决于不同的场景和目的,谈话内容有可能是天气,也有可能是时间计划,以及其他各种话题。
AI研习社
2018/03/29
9430
如何让人类上瘾 浅谈聊天机器人抓住用户的艺术

相似问题

google hangout聊天机器人可以聊天消息机器人?

227

Google Meet中的聊天机器人虚拟会议聊天

129

我无法在google聊天中获得“配置webhook”选项

20

用于聊天机器人的Flex

13

Sensu,用于多聊天室的Google聊天处理程序

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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