为什么重新分配后变量的类型再次变为“未知”

2023-12-11

Why value属于类型unknown分配后再次string to it?

TypeScript Playground 中的示例


function example(): boolean {
  let value: unknown = 'something' // maybe here is some function call, which returns unknown

  if (!(typeof value === 'string') && !(typeof value === 'number')) {
    return false
  }

  value // string | number

  value = 'test'

  value // unknown

  return true
}


您刚刚遇到了这个问题微软/TypeScript#27706,目前被标记为功能请求而不是错误。但这绝对令人困惑。


TypeScript 执行缩小基于一些启发式规则。其中一些规则能够缩小the unknown type,而其他人只能在以下值上正常工作联合类型. (And unknown不是工会)。

例如,typeof类型保护器从事于unknown,如中提到的微软/TypeScript#24439,拉取请求引入unknown。他们在工会工作。所以这些看起来是一样的:

let value: string | number | boolean = 
  ["abc", 123, true][Math.floor(Math.random() * 3)];

if (!(typeof value === 'string') && !(typeof value === 'number')) {
  return false
}

value // string | number

and

let value: unknown = 
  ["abc", 123, true][Math.floor(Math.random() * 3)];

if (!(typeof value === 'string') && !(typeof value === 'number')) {
  return false
}

value // string | number

But 任务缩小不缩小unknown。赋值首先将变量扩大回其原始类型(因此任何先前的缩小都将被重置),然后将变量过滤为仅可分配新值的那些联合成员。就像你正在使用the Extract<T, U>实用型.

如果你有一个类型的变量string | number | boolean然后你分配一个string到它,那么变量将缩小为Extract<string | number | boolean, string>这是string:

let value: string | number | boolean = "test";
value.toUpperCase(); // okay

But unknown不是联合体,如果您分配一个string对于它,结果类型将是Extract<unknown, string>这只是unknown,并且编译器不理解它是一个string:

let value: unknown = 'something' 
value.toUpperCase(); // error!

这就是您所看到的行为的原因。您可以使用typeof缩小unknown to string | number,但是当你做作业时,它会扩大到unknown。建议在微软/TypeScript#27706分配给unknown变量应该缩小。如果您同意,您可能想给这个问题一个????,但这是一个相当长期的开放问题,所以我不指望这里很快会有任何改变。 (最近的缩小范围的改进似乎不影响这个。)

Playground 代码链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么重新分配后变量的类型再次变为“未知” 的相关文章

  • 使用 Typescript 时的 MongoDB FindOptions

    我正在将 JS 项目转换为 TS 并且在查询集合时遇到 FindOptions 问题 我只想获取集合中所有元素的 ID 这是导致 TS 错误的 TS 代码 import Collection Db Document MongoClient
  • 如何将yarn add/npm install与monorepos一起使用

    我需要从 GitHub 中的私有 monorepo 下载节点包 类似于 monorepoProject subProjectA subProjectB 还有两个子项目A and 子项目B是 typescript 项目 如下图所示 subPr
  • AWS CDK CodePipeline 在源代码和构建之间添加一个阶段

    我跟着使用 CDK Pipelines 持续集成和交付 CI CD https docs aws amazon com cdk v2 guide cdk pipeline html实施 CodePipeline 的指南 我想知道如何在 CD
  • 打字总是抱怨全局模块

    我对打字稿很陌生 无论我尝试安装什么类型 我都会得到 打字错误 消息 尝试将 Angular 编译为外部模块 但它看起来像全局模块 我只是想做 typings install dt angular 我究竟做错了什么 Update 如果您对此
  • 为什么 React router v6 useParams 返回属性可能为“未定义”的对象?

    为什么要反应路由器 v6使用参数 https reactrouter com docs en v6 api useparams返回属性可能为 未定义 的对象 在下面的代码中 我的 IDE 指示const slug string undefi
  • 安装 npm 包时无法解决依赖关系树错误

    当尝试使用安装 npm 包时npm i命令 我收到以下异常 我尝试重新安装 Node js 包并使用以下命令将代理设置为关闭 set HTTP PROXY set HTTPS PROXY 问题仍然存在 我做错了什么 Update 当我运行以
  • 指定枚举类型

    有枚举 enum Foo Bar should cause type error Baz Baz 可以为其指定类型以使其成为仅字符串枚举吗 如果您愿意 您可以执行以下操作 创建一个函数 要求其输入只有string 有价值的属性 const
  • TypeScript 接口函数属性:有什么区别?

    有人可以解释一下 为什么在这段代码中 对 Interface 类型常量的赋值有效 但对 Interface 类型常量的赋值会抛出错误 interface InterfaceA doSomething data object boolean
  • 如何使用语言服务器协议将 TS 解析为符号?

    我是这个主题的新手 所以我很可能弄错了一些关键术语 我想将打字稿文件解析为其组件符号 举一个我想象的非常粗略的例子 请参见下文 some ts file export function yell output string alert ou
  • 无法在 typeScript 和 Webpack 中使用 p5.js

    我有一个使用图书馆的项目p5 js https github com processing p5 js Details 我的 Webpack 配置是 const path require path module exports entry
  • 使用复合键的 DataLoader

    我了解 dataLoader 如何使用简单的键工作 import DataLoader from dataloader import myService from services service export default gt new
  • 使用 XLSX.readFile 读取文件

    在 Typescript 中 执行时出现错误 无法读取未定义的属性 替换 const xlsx XLSX readFile fileName filename 是现有文件的路径 我读过 readFile https docs sheetjs
  • ServiceStack 身份验证中 httponly ss-tok bearerToken cookie 的意义是什么

    我从安全角度理解 Set Cookie 响应标头值的 httponly 标志的概念并防止 XSS 攻击 我不明白的是 ServiceStack 对保存 bearerToken 的 ss tok cookie 做了什么 根据服务堆栈文档 ht
  • 如何找到所有带有某种装饰的类?

    在Java中 我们可以使用 类路径扫描 找到具有给定注释的所有类 我们如何在 TypeScript 中做类似的事情 有没有办法找到所有装饰有某种装饰的类 这是一个例子 它假设您有某种方式引用范围 这magical类装饰器创建一个名为的字符串
  • TypeScript 源映射文件不适用于 Chrome

    我正在尝试在 Chrome 中进行 TypeScript 源调试 但遇到了两个特定且可能相关的问题 第一个是由 TypeScript WebEssentials 编译器生成的注释 该注释应该标识源映射文件的位置 如下所示 sourceMap
  • 获取路由查询参数

    我正在尝试从 rc1 迁移到 rc4 但在获取查询字符串参数时遇到问题 ActivatedRoute 对象始终为空 英雄组件 ts import Component OnInit from angular core import Contr
  • IE 11 的 Map(iterable) 替代方案

    不幸的是我必须支持IE11 我使用以下代码创建地图 已使用 entries 的 polyfill const map new Map Object entries array 但由于IE11不支持iterable构造函数中Map 是空的 我
  • 如何让 Angular 2 选择动态添加的 routerLink 指令

    正如所见这个笨蛋 https plnkr co edit K906Y8KtkgYVgAIsCLqE p preview 我动态地将 HTML 添加到我的一个元素中 这可以归结为 Component selector my comp temp
  • 如何获取从类实例克隆的对象的类型?

    假设我有这个示例类 但实际上它有更多属性 class Foo name string dob number constructor name string dob number this name name this dob dob get
  • 使用函数重载进行解构

    我正在尝试创建一个函数 该函数需要一对坐标或一个对象x and y属性并返回邻居列表 但由于某种原因 即使我检查了它的类型 我也无法解构该对象 interface Coords x number y number public getNei

随机推荐

  • 使用 C# 中的正则表达式返回包含匹配项的整行

    假设我有以下字符串 string input Hello world n Hello foobar world n Hello foo world n 我有一个正则表达式模式 由我正在编写的工具的用户指定 foobar 我想返回每行的整行i
  • 获取嵌套字典中所有键的列表

    我想获取包含列表和字典的嵌套字典中所有键的列表 我目前有这段代码 但似乎缺少向列表添加一些键 并且还重复添加了一些键 keys list def get keys d or l keys list if isinstance d or l
  • NSDate initWithString

    将 Xcode 更新到版本 4 2 后 我在当前项目中收到以下警告 警告 NSDate 可能不会响应 initWithString 我必须做什么 此方法仅在 Mac OSX 页面的文档中注明 在 iOS 中未注明 我不清楚为什么苹果有不同的
  • 如何将索引处的行插入排序的ag-grid

    我有一个启用排序的网格设置 每行都有一个重复按钮 复制行时 我想在复制的行下方插入新行 这适用于默认排序 但如果您对列进行排序 例如状态 它会将该行随机插入到网格中 从而很难找到 我注意到网格在保存过程中的某个时候会进行排序 但在它得到分配
  • android httpclient 和 utf-8

    我正在尝试连接到一个网络服务 我的查询中保存了一些数据 不好的是 这些数据包含utf 8字符 这会出现问题 如果我只是使用普通字符串调用 HttpGet 则会出现 非法字符 异常 所以我用谷歌搜索并尝试了一些 utf 8 魔法 HttpCl
  • jQuery 按类对列表项进行分组

    我有一个具有相同类列表项的无序动态列表 我想将相同的类列表项分组到主 ul 中的一个 ul 中 如何对相同类别的列表项进行分组 我想转换下面的动态列表 ul li class a1 Some Content li li class a1 S
  • 使用c#搜索文本文件并显示行号和包含搜索关键字的完整行

    我需要帮助使用 c 搜索文本文件 日志文件 并显示行号和包含搜索关键字的完整行 这是对以下内容的轻微修改 http msdn microsoft com en us library aa287535 28VS 71 29 aspx int
  • 如何为多个进程缓存 eToken PIN

    我有一个 NET c 应用程序 它使用 我的 证书存储中的 x509Certificate2 最初来自 eToken 设备 当我使用证书 解密数据或将其用作 Web 请求的客户端证书 时 它会询问设备 PIN 一次 之后 它会被缓存 用户不
  • Glassfish V3.x 和远程独立客户端

    连接到a绝对没问题ActiveMQ作为独立客户端 您唯一需要做的就是添加activemq all 5 4 1 jar就这样 prop put Context SECURITY AUTHENTICATION system prop put C
  • 仅接受使用 scanf 输入的数值

    如何确保用户仅输入数字值而不是字母数字或任何其他字符 另外 要寻找什么来插入不正确输入的错误消息 include
  • Laravel 5.5:会话不起作用

    我在用着Session put client id 设置一个会话值 该值保留在控制器内和应用程序内的其他位置 但我通过 Vue 的 API 路由调用的控制器除外 我已经进行了编辑 driver gt env SESSION DRIVER d
  • 如何使用 C 以编程方式在 Windows 7 上设置 IP 地址

    我正在开发一个需要能够设置 IP 地址的应用程序 使用命令提示符 Netsh接口IP设置地址 它可以工作 但是 c 中的等效项是什么 Thanks 我认为您需要 AddIPAddress API 参考添加IP地址函数MSDN 文档中有一个很
  • 将word文档插入另一个word文档而不改变格式VBA

    首先 我通过用户窗体上的按钮将 Word 文档 doc1 复制到新的 Word 文档 并采用其格式 其次 我在这个word文档 填充有doc1 的末尾插入一个新的word文档doc2 doc1和doc2有文本和表格以及各种颜色 每次我按下另
  • JSP/HTML 页面到 PDF 的转换 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 如何将 JSP HTML 文件转换为 PDF 我想将网页的特定部分转换为 PDF 文件 是否可以 是的 好好看看展位阿帕奇FOP and iText
  • 如何在 Excel 中查找拼写错误的文本之间的匹配项?

    我有两列数据 其中有一百个名字 我需要找到匹配项 问题是第二列上的名称与第一列上的名称不完全相同 很难用一百个名字来匹配他们 excel中是否有任何公式至少可以给出数据的公差 例如 Setyadi 与 Setiadi 或 Tak Jelan
  • 时间戳/日期作为 cassandra 列族/hector 的关键

    我必须创建并查询一个复合键为 timestamp long 的列族 还 查询时我想触发时间戳范围查询 例如 xxx 和 yyy 之间的时间戳 这可能吗 目前我正在做一些非常有趣的事情 我知道这是不正确的 我为给定范围创建带有时间戳字符串的键
  • Codeigniter simple_query 与查询生成器(插入、更新和删除)

    根据文档 simple query不会返回任何数据库结果集 也不会设置查询计时器 或编译绑定数据 或存储查询以进行调试 正如在我的 CodeIgniter 中一样 我使用 CI 提供的查询生成器来生成查询 那么 这些用于插入 更新和删除的查
  • 从非 UI 线程弹出对话框

    我正在开发一个面向团体的网络应用程序 问题是 当我要加入一个组时 它首先检查该组是否安全 如果是 它会要求输入用户名和密码 获得组安全性可能需要几秒钟 因此我为整个过程生成一个新线程 我想弹出一个对话框 以防该组需要安全性 我认为这可能与后
  • 在 C++ 中处理巨大的多维数组

    我正在用 C 设计一款类似于 Minecraft 的游戏 它在内存中保存了大量的地形数据 一般来说 我想在内存中存储一 个数组 即 5 4 5 50 50 50 这还不错 因为它相当于大约 100mb 的虚拟内存 而我的结构只有大约 8 个
  • 为什么重新分配后变量的类型再次变为“未知”

    Why value属于类型unknown分配后再次string to it TypeScript Playground 中的示例 function example boolean let value unknown something ma