首页
学习
活动
专区
工具
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.4K10

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.2K20
  • 精读《Typescript 4.4》

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

    59220

    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 工具类型

    30510

    @types react 中值得注意 TS 技巧

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

    1.2K20

    理解 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 关键字时其被调用时具备类型功能。

    51810

    精读《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)。

    67620

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

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

    23610

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

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

    2.2K20

    组合类型类型保护_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.6K20

    TypeScript查漏补缺(基础类型)

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

    89920

    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 语句中导入和导出用类型声明,但是不支持值导入导出。

    86420

    如何处理TypeScript可选项和Undefined

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

    3.8K10

    让你更好使用 Typescript 11个技巧

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

    1.1K20

    了不起 TypeScript 入门教程

    2.11 Never 类型 never 类型表示是那些永不存在类型。 例如,never 类型是那些总是会抛出异常或根本就不会有返回函数表达式或箭头函数表达式返回类型。...之后,可恶错误消息又消失了,因为这时 result 变量类型是 string 类型 TypeScript 中除了可以重载普通函数之外,我们还可以重载类中成员方法。...TypeScript 可访问性修饰符(如 public 或 private); 私有字段不能在包含类之外访问,甚至不能被检测到。...设计泛型关键目的是成员之间提供有意义约束,这些成员可以是:类实例成员、类方法、函数参数和函数返回值。 泛型(Generics)是允许同一个函数接受不同类型参数一种模板。...R : any; 以上代码中 infer R 就是声明一个变量来承载传入函数签名返回类型,简单说就是用它取到函数返回类型方便之后使用。

    7K52
    领券