let route: keyof typeof menu; route = 'store'; // No error 在这种情况下,TypeScript认为 route 是一个可能会发生变化的字符串。...const menu = { home: '/home', about: '/about', contact: '/contact' } as const; 通过这个简单的改变,我们的对象属性变成了只读...通过使用 as const 使对象变为不可变,TypeScript 现在明白 route 应该只允许提供的键。现在,我们得到了我们想要的确切结果:当我们试图设置无效值时,会出现类型错误。...一个配合 'as const' 的更清洁的 'go to root' 函数 我们使用 as const 重构 goTo 函数: function goTo(route: keyof typeof menu...使用 'as const' 提取对象值 我们使用 as const 提取我对象值,颠覆TypeScript的规则,获取我们需要的所有详细信息,以编写强大且无bug的代码。这只需要一点类型魔法。
一、typeof 简介 在 TypeScript 中,typeof 操作符可以用来获取一个变量或对象的类型。...下面我们来举一个 const 断言的例子: let x = "hello" as const; type X = typeof x; // type X = "hello" let y = [10,...Z = typeof z; // let z: { readonly text: "hello"; } 数组字面量应用 const 断言后,它将变成 readonly 元组,之后我们还可以通过 typeof...操作符获取元组中元素值的联合类型,具体如下: type Data = typeof y[number]; // type Data = 10 | 20 这同样适用于包含引用类型的数组,比如包含普通的对象的数组...三、typeof 和 keyof 操作符 在 TypeScript 中,typeof 操作符可以用来获取一个变量或对象的类型。而 keyof 操作符可以用于获取某种类型的所有键,其返回类型是联合类型。
,它的类型推断是这样的: 然后在这个 PR 被发布后,类型推断将会变成这样: 这个变化有啥用呢?...在一些动态语言中,鸭子类型的常见用法就是假设给定值是符合我们预期的,你可以先尝试执行一个操作,然后我们再去处理不符合预期的情况下的异常。...),类型谓词是一个返回布尔值的函数,可以用来做类型保护; 类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。...换句话说,类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数字。 实际上它就是告诉 TypeScript 编译器给定的值是就是我们给定的那个类型。...const nums: number[] 毫不夸张的说,我认为这是 TypeScript 最几个版本中我觉得最有用的一个特性,其实算是修复了 TypeScript 类型推断的一个长期存在的缺陷,可以让捕获函数中的类型收窄逻辑变得更加简单
4. typeof typeof 操作符可以用来获取一个变量或对象的类型。...: const defaultOption = { timeout: 500 } type Opt = typeof defaultOption 当一个 interface 总有一个字面量初始值时...Point; 写一个方法获取对象里面的属性值时,一般人可能会这么写 function get1(o: object, name: string) { return o[name]; } const...当然如果把 o: object 修改为 o: any 就不会报错了,但是获取到的值就没有类型了,也变成 any 了。...a = { foo: { bar: 22 } } const b = a as DeepReadonlytypeof a> b.foo.bar = 33 // Cannot assign to 'bar
X : Y 表示,如果 T 可以赋值给 U (类型兼容),则返回 X,否则返回 Y; 1.3、使用 `keyof` 和 `in` keyof 可以用来取得一个对象接口的所有 key 值: interface...TypeScript 为此提供了一个示例,他们创建了一个叫作 Flatten 的类型,用于将数组转成他们需要的元素类型: type Flatten = T extends any[] ?...: T[P] }; 解释: keyof T 拿到 T 所有属性名 然后 in 进行遍历, 将值赋给 P, 最后 T[P] 取得相应属性的值. 结合中间的 ?...: T[P] }; 解释: 我们发现一个有意思的用法 -?, 这里很好理解就是将可选项代表的 ? 去掉, 从而让这个类型变成必选项 与之对应的还有个 +? , 这个含义自然与 -?...R : any; 解释: 我们可以用 infer 声明一个类型变量,是用它获取函数的返回类型,简单说就是用它取到函数返回值的类型方便之后使用.
引言 七种非常有用的 TypeScript 类型,包括获取对象类型、函数返回类型、嵌套类型的查看、可选属性和排除属性等。...typeof const obj = { name: "yiyun", age: 16 } type Person = typeof obj keyof const obj...= { name: "yiyun", age: 16 } type Person = keyof typeof obj ReturnType const func = (...typeof func> 添加 Awaited const func = async () => { const val = "string" return val...7 Awesome TypeScript Types You Should Know - YouTube
比如我们定义一个颜色对象const palette = { red: [255, 0, 0], green: "#00ff00", blue: [0, 0, 255]};因为每个属性都被赋予了默认值...但是,如果没有进行类型标准,会变成什么样子呢?...这会保证我们检查的左边是合法的key,而右边不是在检查一个基础类型。这个功能虽然简单,但是让 TypeScript 的断言能力进一步提升,为开发者写出更安全的代码提供了方便。...对比较NaN进行检查对于JavaScript开发者来说,检查一个值和NaN的关系是一件不容易的事。因为NaN是一个特殊的数字型值,表示 “不是一个数字”。任何值和NaN都不相等,包括NaN自己。...但是 JavaScript的原生数字类型是一个浮点数型数字值,并且 JavaScript的数字解析经常会出现NaN。检查和 NaN在处理数字相关的代码时,是比较常见的。
resolveJsonModule TypeScript 2.9 版本中添加了一个 resolveJsonModule 编译选项,它允许我们在 TypeScript 模块中导入 JSON 文件。...,不具备任何属性和方法 复制代码 当然,unknown 也能被断言,或是类型缩小至一个指定的范围: const name: unknown = 'hello'; const str = name as...unknown) { if (typeof x === 'string') { // 在这个块中,TypeScript 知道 `x` 的类型必须是 `string` console.log...断言 当声明一个可变变量或者属性时,TypeScript 通常会扩展变量类型,来确保我们在不编写显示类型时,可以赋值内容: let x = 'hello'; // x 的类型是 string //...function func() { // 可能是经过一系列计算得到的值 return { pos: 'left' } as const } // ok let t: Test =
z,和一个number类型的集合,返回一个 number 类型的值。...上面代码可以=号为分界点来理解 =左部分:定义了一个mySum变量,它表示一个函数,接受number类型的 x 、y,最后返回值也是number =右部分:一个函数,接受 number 类型的 x 和....length;// 临时把 someValue 断言为一个string 类型的值 #将任何一个类型断言成 any 但有的时候,我们非常确定这段代码不会出错,比如下面这个例子: window.foo...返回值的约束,这也同时去除掉了代码中的 any,是最优的一个解决方案。...myNumberClass 为例,来分析一下其调用过程: 在实例化 IdentityClass 对象时,我们传入 Number 类型和构造函数参数值 68; 之后在 IdentityClass 类中,类型变量 T 的值变成
类型别名会给一个类型起个新名字。类型别名有时和接口很像,但是可以作用于原始值,联合类型,元组以及其它任何你需要手写的类型。...typeof 在 JS 中 typeof 可以判断一个变量的基础数据类型,在 TS 中,它还有一个作用,就是获取一个变量的声明类型,如果不存在,则获取该类型的推论类型。...: string; } const jack: Person = { name: 'jack', age: 100 }; type Jack = typeof jack; // -> Person...R : any; 其实这里的 infer R就是声明一个变量来承载传入函数签名的返回值类型, 简单说就是用它取到函数返回值的类型方便之后使用。...PowerPartial : T[U] }; Deferred 相同的属性名称,但使值是一个 Promise,而不是一个具体的值: type Deferred = {
【TypeScript 4.5】004-第 4 章 类型缩小 一、typeof 类型守卫 1、什么是类型缩小 含义 TypeScript 类型缩小就是从宽类型转化为窄类型的过程 类型缩小常用于处理联合类型变量的场景...} // 下面两种结果都返回 true ,值与 if() 括号里面的值判断标准一致! Boolean("hello") !!"world" // 一个!将其转换为文字类型,里昂一个!...fly } 五、instanceof 操作符缩小 1、概述 说明 JavaScript 使用 instanceof 操作符来检查一个值是否是另一个值的实例 instanceof 也是一个类型保护 TypeScript...执行结果 此处变成了具体的类型而不是联合类型,可参考下面的控制流分析!...我们只需要定义一个函数 并使其返回值是一个类型谓词即可 代码示例 pet is Fish 就是所谓的类型谓词,意思是:如果 pet 里面有 swim 这个属性,pet 就是 Fish 类型!
# 索引类型访问 在 JavaScript 中可以通过 obj[expression] 方式来动态访问一个对象属性(即计算属性),expression 表达式会先被执行,然后使用返回值来访问属性。...工具类型 # 类型安全保护 # 类型查询 TypeScript 存在两种功能不同的 typeof 操作符,常见的是 JavaScript 中用于检查变量类型的 typeof,它会返回 'string...在 TypeScript 中,还新增了用于类型查询的 typeof 操作符,它会返回一个 TypeScript 类型: const str = 'Cell'; const obj = { name: '...func; // (input: string) => boolean 不仅可以直接在类型标注中使用 typeof,还能在工具类型中使用 typeof: const func = (input:...TypeScript 引入了 is 关键字来显式地提供类型信息: function isString(input: unknown): input is string { return typeof
在 TypeScript 中,检查 typeof 的返回值就是一种类型保护的方式。...因为 TypeScript 可以编码 typeof 对不同值的操作方式,所以它也知道这个运算符在 JavaScript 中的一些怪异表现。...=== "object") { for (const s of strs) { console.log(s); } } else if (typeof strs ===...if (strs) { if (typeof strs === "object") { for (const s of strs) { console.log(s);...虽然在第一次赋值之后,x 的可观察类型变成了 number,但我们仍然可以给它赋值 string 类型的值。
答:联合类型允许一个变量有多种类型。它通过使用 | 来表示类型之间的符号。这允许变量存储任何指定类型的值。...“值重新映射”允许您使用条件类型更改现有类型的值。这是一个例子: type ValueRemapped = T extends 'a' ? 'x' : T extends 'b' ?...答案:TypeScript 中的“as const”断言用于推断数组和对象的文字类型。它告诉编译器该值应被视为常量,而不是扩展到其基本类型。...这是一个例子: const name = 'John'; type NameType = typeof name; // Result: string function printType(value:...在此示例中,isString 函数是一个类型谓词,用于检查值是否为字符串。
(args) > 这里我们来举一个可选的属性访问的例子: const val = a?.b; 为了更好的理解可选链,我们来看一下该 const val = a?....空值合并运算符 在 TypeScript 3.7 版本中除了引入了前面介绍的可选链 ?. 之外,也引入了一个新的逻辑运算符 —— 空值合并运算符 ??。...比如为 falsy 值(’’、NaN 或 0)时。 这里来看一个具体的例子: const foo = null ??...换句话说,类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数字。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。...对于一个数字字面量,你现在可以通过把一个下划线作为它们之间的分隔符来分组数字: const inhabitantsOfMunich = 1_464_301; const distanceEarthSunInKm
const b = ["Alice", "Bob", "Eve"] as const TypeScript 5.0 允许您将 const 修饰符添加到类型参数声明中: declare function...所有枚举都是联合枚举 在 TypeScript 5.0 中,所有枚举现在都被视为联合枚举。 联合枚举为使用枚举值提供了更好的类型安全性和改进的人体工程学。...val = getStringValue(E.A); // "100" TypeScript 5.0 通过为每个计算成员创建唯一类型,设法将所有枚举变成联合枚举。...a === 'number' && typeof b === 'number') { return a + b; } else if (typeof a === 'string' && typeof...t: number = Numbers.two; 对构造函数中的参数装饰器进行更准确的类型检查 — experimentalDecorators 一些已弃用的配置和配置值。
unique symbol 与声明紧密相关,只允许在 const 声明中引用这个确切的符号。 你可以将 TypeScript 中的名义类型视为 JavaScript 中的名义值。...mode') function showWarning(msg: string, mode: typeof DEV | typeof PROD) { // ... } 符号位于 TypeScript...运行时枚举 一个有趣的符号例子是在 JavaScript 中重新创建运行时的 enum 行为。TypeScript 中的 enum 是不透明的。...) { // Nope } 我们要添加一些 TypeScript 注释: 我们将所有符号键(和值)声明为 unique symbols,这意味着我们分配符号的常量永远不会改变。...break; } } 如果使用 symbol 键和值而不是仅使用 symbol 值,则可以删除辅助和 const 上下文: const ColorEnum = { [COLOR_RED]: COLOR_RED
我们创建变量并为其分配一个值,但不指定类型,如下所示: const language = { name: "JavaScript" }; 在此代码块中,语言是一个对象,其中包含属性名称的字符串值。...例如,如果我们想输入一个包含多个数值的数组,我们可以这样做: const primeNumbers: number[] = [2, 3, 5, 7, 11]; 如果我们给这个数组分配了一个字符串值,TypeScript...使用前面的例子,它会变成这样: const primeNumbers: Array = [2, 3, 5, 7, 11]; 两种方式是相同的,所以选择一种并尝试仅使用该格式来表示数组。...当使用未知类型的值执行任何操作时,TypeScript 需要确保类型是它所期望的类型。这样做的一个例子是使用 JavaScript 中已经存在的 typeof 运算符。...例如,假设我们创建了一个数值变量: const year: number = 2021; 如果我们创建一个 if 块以在 year 不是数字的情况下运行某些代码,则可能如下所示: if (typeof
类型守卫是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。...TypeScript使用了一些内置的JavaScript操作符,比如typeof、instanceof和in操作符,这些操作符用于确定一个对象是否包含属性。...有了这个类型守卫,我们可以测试一个对象或值是否派生自一个类,这对于确定实例类型的类型很有用。...将类型缩减为Necklace,而不是只返回一个布尔值。...结尾 TypeScript类型守卫有助于确保类型的值,改善整体的代码。在本文中,我们回顾了TypeScript中几个最有用的类型守卫,并通过几个例子来了解它们的实际应用。
TS系列地址: 21篇文章带你玩转ts # 类型断言 类型断言(Type Assertion)可以用来手动指定一个值的类型。...但是有的情况下 ApiError 和 HttpError 不是一个真正的类,而只是一个 TypeScript 的接口(interface),接口是一个类型,不是一个真正的值,它在编译结果中会被删除,当然就无法使用...§ 理想情况下,TypeScript 的类型系统运转良好,每个值的类型都具体而精确。...,但是并没有什么用,代码在编译后会变成: function toBoolean(something) { return something; } toBoolean(1); // 返回值为 1...这和类型断言是非常相似的,而且产生的结果也几乎是一样的——tom 在接下来的代码中都变成了 Cat 类型。
领取专属 10元无门槛券
手把手带您无忧上云