首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在只能返回窄类型的映射之后,TypeScript不能返回窄类型呢?

在TypeScript中,当我们使用映射类型(Mapped Types)时,有时候我们希望返回一个窄类型(narrow type),即只包含特定属性的子类型。然而,TypeScript当前的设计决策是,映射类型只能返回宽类型(wide type),即包含所有属性的父类型。

这个设计决策是为了确保类型系统的安全性和一致性。如果允许映射类型返回窄类型,可能会导致类型不一致的情况发生。考虑以下示例:

代码语言:txt
复制
type MyMappedType<T> = {
  [K in keyof T]: T[K] extends string ? string : number;
};

type MyType = {
  foo: string;
  bar: number;
};

const myValue: MyMappedType<MyType> = {
  foo: "hello",
  bar: "world", // 编译错误
};

在上面的示例中,我们定义了一个映射类型MyMappedType,它将T中的所有属性的类型映射为stringnumber。然而,由于MyMappedType返回的是窄类型,即只包含特定属性的子类型,当我们尝试将"world"赋值给bar属性时,会导致类型不匹配的编译错误。

为了避免这种类型不一致的情况,TypeScript选择了限制映射类型只能返回宽类型,即包含所有属性的父类型。这样一来,我们可以确保在使用映射类型时,返回的类型是兼容的,不会引发类型错误。

虽然这个设计决策可能会限制一些特定场景下的灵活性,但它有助于保持类型系统的一致性和可靠性。在实际开发中,我们可以通过其他方式来实现窄类型的需求,例如使用条件类型(Conditional Types)或其他类型操作符。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云官网:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(Tencent Blockchain):https://cloud.tencent.com/product/tencentblockchain
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java中为什么不同返回类型不算方法重载?

: 那为什么返回类型不能做为方法签名一部分?...原因其实很简单,试想一下,如果方法返回类型也作为方法签名一部分,那么当程序员写了一个代码去调用“重载”方法时,JVM 就不能分辨要调用哪个方法了,如下代码所示: public class OverloadExample...(String name) { // doSomething return "磊哥聊编程"; } } 像以上情况,JVM 就推断不出来要调用哪个方法了,所以方法返回类型不能作为方法签名一部分...总结 同一个类中定义了多个同名方法,但每个方法参数类型或者是参数个数不同就是方法重载。方法重载典型使用场景是 String 中 valueOf 方法,它有 9 种实现。...方法返回类型不能作为方法重载依据,因为它不是方法签名组成部分。

3.3K10

TypeScript】never 和 unknown 优雅之道

1、前言  TypeScript 版本 2.0 和 3.0 分别引入了 “never” 和 “unknown” 两个基本类型引入这两个类型之后TypeScript 类型系统得到了极大完善。...引入 TypeScript 之后,我们甚至还会抱怨:“这代码怎么还越写越多了?”。 其实我们应该反过来思考,OOP 编程范式,才是 ES6 后代码应该有的模样。...使用它之前,我们需要想两件事: 能否使用更具体类型 能否使用 unknown 代替 都不能情况下,any 才是最后选择。...显然不能,举个很简单例子: const a = 'anything'; const b: any = a; // 能够赋值 const c: never = a; // 报错,不能赋值 而我们为什么说...返回类型为底部类型函数不能返回任何值,甚至不能返回零大小单元类型。因此返回类型为底部类型函数不能返回

1.1K20

精读《Typescript 4.4》

本周精读文章:announcing-typescript-4-4 概述 更智能自动类型 类型功能非常方便,它可以让 Typescript 尽可能像 Js 一样自动智能判定类型,从而避免类型定义工作...其实这个功能早就有了,我们 精读《Typescript2.0 - 2.9》 就已经介绍过,当时用名词是自动类型推导,这次用了更精确自动类型一词,因为只有类型是安全,比如: function...这句话很有意思,一个函数任何地方都可能出现运行时错误,这根本不是静态分析可以解决,所以不可能自动推断错误类型,所以只能用 any。...: number | undefined; } 为什么要这么定义?因为很多情况下,没有这个 key,与这个 key 值为 undefined 表现是等价。...仔细想想这是合理,既然定义类型不是 undefined,就算对象是可选类型,也不能认为赋值 undefined 是合理,因为 age?

57320

TypeScript 5.4:带来新类型和一些 Break Change

大家好,最近 TypeScript 发布了 5.4 Beta 版本,其中包含了一些值得关注新特性以及一些 Break Change,我们一起来看下吧: 优化闭包中类型类型 TypeScript...可是,在数组 map 方法中,TypeScript 不能保证 url 类型已经化为 URL,因为他无法确定在回调函数被执行的当下,url是否仍然是 URL 对象,这是因为函数闭包中,变量可能会被之后代码改变...如果找到一个,TypeScript 可以从包含该函数外部安全地化,那上面的代码示例就可以正常工作了。 但是还需要注意一点,如果我们是嵌套函数中任何地方对变量进行了赋值,类型还是不起作用。...其实也是属于类型一种。 工具类型:NoInfer TypeScript 中,有时候我们写代码时候不需要明确告诉它变量是什么类型TypeScript 会自动根据我们给值来推断出类型。...这就是为什么 TypeScript 5.4 引入了一个新 NoInfer 工具类型

23210

理解 TypeScript 类型

本文是 ”重学TS系列“ 第 29 篇文章,感谢您阅读! 一、类型 TypeScript 类型就是从宽类型转换成类型过程。...因此,TypeScript 能够从此代码块内联合类型中排除 null 类型,从而产生更类型,更易于使用。 此外,你还可以通过抛出异常或从分支返回,来收变量类型。...如果 TypeScript 不能识别出类型,你甚至可以引入一个自定义函数来帮助它: function isInputElement(el: HTMLElement): el is HTMLInputElement...el is HTMLInputElement,作为返回类型告诉类型检查器,如果函数返回true,则 el 变量类型就是 HTMLInputElement。...三、总结 理解 TypeScript类型将帮助你建立一个关于类型推断如何工作认知,进一步理解错误,它通常与类型检查器有更紧密联系。

4.6K20

精读《@types react 值得注意 TS 技巧》

问题:React.useReducer 第一个参数是 Reducer,第二个参数是初始化参数,其实第二个参数类型是第一个参数中回调函数第一个参数类型,那我们怎么将这两个参数关系联系到一起?...S : never 含义是:如果 R 符合 Reducer 类型,则返回类型 S,这个 S 是 Reducer 也就是 State 位置类型,否则返回...类型重载 当一个类型拥有多种使用可能性时,可以采用类型重载定义复数类型Typescript 作用时会逐个匹配并找到第一个满足条件。...自定义类型 我们可以通过 typeof 或 instanceof 做一些类型工作,但有些类型甚至自定义类型判断函数需要自定义,我们可以通过 is 关键字定义自定义类型判断函数。...,通过 is 关键字时其被调用时具备类型功能。

50010

@types react 中值得注意 TS 技巧

问题:React.useReducer 第一个参数是 Reducer,第二个参数是初始化参数,其实第二个参数类型是第一个参数中回调函数第一个参数类型,那我们怎么将这两个参数关系联系到一起?...S : never 含义是:如果 R 符合 Reducer 类型,则返回类型 S,这个 S 是 Reducer 也就是 State 位置类型,否则返回...类型重载 当一个类型拥有多种使用可能性时,可以采用类型重载定义复数类型Typescript 作用时会逐个匹配并找到第一个满足条件。...自定义类型 我们可以通过 typeof 或 instanceof 做一些类型工作,但有些类型甚至自定义类型判断函数需要自定义,我们可以通过 is 关键字定义自定义类型判断函数。...,通过 is 关键字时其被调用时具备类型功能。

1.2K20

精读《Typescript 4.5-4.6 新特性》

新增 Awaited 类型 Awaited 可以将 Promise 实际返回类型抽出来,按照名字可以理解为:等待 Promise resolve 了拿到类型。...也许有时不想随着 TS 版本升级而升级连带 dom 内置类型,所以 TS 提供了一种指定 dom lib 类型方案, package.json 申明 @typescript/lib-dom 即可:...,但现在才支持按照模版字符串分支条件时,做类型。...片段自动补全增强 Class 成员函数与 JSX 属性自动补全功能做了增强,使用了最新版 TS 之后应该早已有了体感,比如 JSX 书写标签输入回车后,会自动根据类型补全内容,如: <App cla...值得注意是,这种类型推导是从前到后,因为参数是自左向右传递,所以是前面推导出后面,而不能是后面推导出前面(比如不能理解为,第二个参数为 number 类型,那第一个参数值就必须为 a)。

64220

TypeScript 5.5 ,即将支持自动推断类型守卫!

,它类型推断是这样: 然后在这个 PR 被发布后,类型推断将会变成这样: 这个变化有啥用?...相比之下, TypeScript 中,try-catch 则存在很多限制 — 你既不能根据抛出异常原型定义不同 catch 块,也不能确定抛出到底是不是一个异常实例。...; } } isDuck 返回类型中使用了 is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值函数,可以用来做类型保护;...简单说,就是告诉编译器这个可能是鸭子东西就是一只鸭子。 类型保护,也是类型一种方式。...const nums: number[] 毫不夸张说,我认为这是 TypeScript 最几个版本中我觉得最有用一个特性,其实算是修复了 TypeScript 类型推断一个长期存在缺陷,可以让捕获函数中类型逻辑变得更加简单

14410

TypeScript 官方手册翻译计划【二】:普通类型

即使没有给参数添加类型注解,TypeScript 也会检查你传递参数个数是否正确 返回类型注解 你也可以给返回值添加类型注解。...当 TypeScript 能够基于代码结构推断出一个更具体类型时,就会发生收。...举个例子,TypeScript 知道只有 string 类型值使用 typeof 之后返回 "string": function printId(id: number | string) { if...如果一个联合类型每个成员都有一个公共属性,那么你可以不需要进行收,直接使用该属性: // 返回值会被推断为 number[] | string function getFirstThree(x:...即使类型断言是错误,也不会抛出异常或者产生 null TypeScript 只允许断言之后类型比之前类型更具体或者更不具体。

2.2K20

TypeScript 4.8 发布!重点新特性解读

TypeScript 4.8 于 8 月 25 日发布正式版,本次发布带来了诸多新特性,我们一起来看几个比较重要改动: 联合类型、交叉类型类型优化 TypeScript 4.8 版本对 --strictNullChecks...主要体现在联合类型、交叉类型以及类型工作方式上。...R : any; 在这个例子中,infer R 代表待推断返回类型,如果 T 是一个函数,则返回函数返回值,否则返回 any。...U : never; TypeScript 4.8 对模版字符串中使用 infer extends 情况进行了优化,下面这种情况 infer 以前会被约束为一个原始类型,现在可以推断出更精确值:...TypeScript 以前允许 JavaScript 文件 import 和 export 语句中导入和导出用类型声明,但是不支持值导入导出。

83520

组合类型类型保护_TypeScript笔记9

typeof variable === 'type'是用来确定基本类型惯用手法,因此TypeScript能够识别typeof,并自动缩对应分支下联合类型: let x: number | string...,见4.24 Type Guards P.S.另外,class具有双重类型含义,TypeScript代码里体现形式如下: 类类型:typeof className 类实例类型:typeof className.prototype...,因为仍无法避免undefined/null.xxx之类错误 strictNullChecks 针对空类型潜在问题,TypeScript提供了--strictNullChecks选项,开启之后会严格检查空类型...后缀类型断言 既然Nullable类型实质上是联合类型,那么同样面临类型问题。...,断言是一次性(或者说是临时),而类型保护一定作用域下都有效 参考资料 Advanced Types

1.5K20

如何处理TypeScript可选项和Undefined

当你对一个对象访问并不存在属性时,JavaScript将会返回undefined,而不是报错。 TypeScript严格模式下,这意味着下面几种情况。...上面示例中c情况很有趣。如果你IDE中把鼠标悬停在Foo上,你会看到TypeScript实际上已经把bar定义为number | undefined联合类型。...但最好解决方式,与JavaScript中解决方式相同:检查你获取值是否是你所期望TypeScript可以理解这类检查,并可以使用它们来收对特定代码类型检查范围(类型)。...TypeScript也会注意这段代码。if子句中,会把bar属性类型为number。...这是因为Array.prototype.find 没有找到指定值情况下会返回undefined。

3.6K10

TypeScript查漏补缺(基础类型)

TypeScript查漏补缺(基础类型) 前言 TypeScript 入门教程看完了,大部分都按自己理解来做了下笔记输出。但是,总感觉有遗漏知识点。于是,找了一些大佬博客,来查漏补缺一下。...sayHello() 但是,这里又有一个疑问:函数没有返回值时,默认返回undefined 那么,声明函数时void类型和undefined类型有什么区别?...undefined void类型不能赋值给undefined这是符合正常情况:即只能赋值给自己和any类型 function sayHello(): void { console.log('...毕竟按上面的写法的话,就像是只能手动制造bug一样。 TS中,可以利用never类型来实现详细检查。...上面的例子中,else分支nickname会被收为boolean类型,而boolean类型无法被赋值给never类型,所以会出现编译错误,就能够提前检测出错误,避免很多没必要问题。

87520

让你更好使用 Typescript 11个技巧

foo = shape; 理解类型声明和类型 TypeScript 有一项非常强大功能是基于控制流自动类型。这意味着代码位置任何特定点,变量都具有两种类型:声明类型类型。...(isCircle) as Circle[]; 一个更优雅解决方案是将isCircle和isRect改为返回类型谓词,这样它们可以帮助Typescript调用 filter 后进一步缩小类型。...但是,模糊不清情况下,我们可能需要干预。分配条件类型就是其中之一。 假设我们有一个ToArray辅助类型,如果输入类型不是数组,则返回一个数组类型。...为什么不是(string | number)[] ?...这种技术背后理由是,never 类型除了 never 之外不能赋值给任何东西。

1K20

TS 中如何实现类型保护?类型谓词了解一下

一、联合类型 TypeScript 中,一个变量不会被限制为单一类型。如果你希望一个变量值,可以有多种类型,那么就可以使用 TypeScript 提供联合类型。...,而类型保护就是实现类型一种手段。...scope. —— TypeScript 官方文档 类型保护是可执行运行时检查一种表达式,用于确保该类型一定范围内。... isCar 函数方法体中,我们不仅要检查 vehicle 变量是否含有 turnSteeringWheel 属性,而且还要告诉 TS 编译器,如果上述逻辑语句返回结果是 true,那么当前判断...== undefined; } 以上代码中,我们定义了一个通用类型保护函数,你可以需要时候使用它来缩类型

3.5K11
领券