索引类型是 TypeScript 中的常见类型,它是聚合多个元素的类型,对象、类、元组等都是索引类型。...: TypeScript 也内置了很多基于映射类型实现的工具类型,比如 Partial、Required 等。...: 而传入联合类型的时候,会分别传入每个类型做处理,也就是这样的: 所以直接在这里取 keyof Obj 的所有索引值: 总结一下:当我们需要把索引分开的时候,可以加一层映射类型,在值的位置对每个索引做处理...总结 索引类型是 TypeScript 中的常见类型,可以通过映射类型的语法来对它做一些修改,生成新的索引类型。...这种套路在需要把索引分开处理,再把结果合并的场景下是很有用的。
类型“{}”上不存在属性“xxx”。...ts(2339)-解决方案集锦 一、方案一(优先尝试) 把 tsconfig.json 里面的 compilerOptions 下的 moduleResolution 属性值改成 node !...二、方案二(优先尝试) 在 tsconfig.json 里面添加下面配置 "include": [ "src/**/*.ts", "src/**/*.d.ts", "src/
我们自己做的组件,一般希望它的属性在设计时能够在属性窗里显示为中文,可以在属性上添加System.ComponentModel.DisplayNameAttribute标注达到这个目的。...但是,枚举的选项如何以中文的形式显示在属性窗里呢?...假设我们有如下枚举: 1: public enum MyEnum 2: { 3: A, 4: B 5: } 在某个组件里有一个MyEnum类型的属性...,发现属性窗中出现了“我的枚举”这个属性,但选项是A和B,如何让它们示为“选项一”和“选项二”呢?...MyEnumConverter))] 3: public MyEnum MyEnum 4: { 5: get; 6: set; 7: } 这样,就可以以中文的形式在属性窗里显示枚举的选项了
function sayRes(res: number | string) { if (res.length > 0) { // Error: 类型“number”上不存在属性“length”。...} } 当 res 为 number 类型时,是不存在 .length 属性的,所以会报错。...“number”上不存在属性“length”。...在给 res 赋值为 12 后,TypeScript 推断 res 的类型为 number,number 类型不存在 .length 属性,所以报错。...总结 以上就是 TypeScript 联合类型的相关知识,总结起来就是: 联合类型包含了变量可能的所有类型; 对联合类型变量赋值为联合类型之外的值,会产生报错; 在不能确定联合类型变量的最终类型之前,只能访问联合类型所共有的属性和方法
什么是 TypeScript、基本语法、高级类型、工程应用 # TypeScript 入门 # 什么是 TypeScript # 发展历史 2012-10:微软发布了 TypeScript 第一个版本...age: number; /* 可选属性:定义该属性可以不存在 */ hobby?...IA│IB"上不存在属性"a"”。...类型 “IB” 上不存在属性 “a" */ /* 结论:访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分 */ if (arg.a) { console.log...# 工程应用 Webpack 在 webpack 中导入 awesome-typescript-loader、babel-loader,配置 tsconfig.js 文件 Node.js
用于手动指定一个值的类型 基本语法 (推荐) 值 as 类型 or (不推荐) 类型> 值 用途 将一个联合类型断言为其中一个类型 TypeScript不确定一个联合类型的变量到底属于哪个类型的时候...“number”上不存在属性“length”。...但是有时候我们的写法是完全没有问题的,比如: window.foo = 1 在js中,这种写法完全ok,给window添加属性foo,值为1,但是,在TypeScript中是不支持的,它会抛出这个错误类型...“Window & typeof globalThis”上不存在属性“foo”。...总结 类型断言的用途: 联合类型可以断言为其中一个类型 父类可以被断言为自类 任何类型可以断言成 any any可以断言成任何类型 A包含B的所有属性,或者B包含A的所有属性,A和B才能相互断言 双重断言
TypeScript 可辨识联合(Discriminated Unions)类型,也称为代数数据类型或标签联合类型。它包含 3 个要点:可辨识、联合类型和类型守卫。...这种类型的本质是结合联合类型和字面量类型的一种类型保护方法。如果一个类型是多个类型的联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护区块。...原因是在 Motorcycle 接口中,并不存在 capacity 属性,而对于 Car 接口来说,它也不存在 capacity 属性。那么,现在我们应该如何解决以上问题呢?...,我们把收窄为 never 类型的 vehicle 变量赋值给同为 never 类型的 invalidVehicle 变量,这样有什么好处呢?...在 evaluatePrice 方法中,我们新增了默认的处理分支,穷举了所有可能的车辆类型。此外我们还引入了 never 类型避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的代码。
keyof 操作符是在 TypeScript 2.1 版本引入的,该操作符可以用于获取某种类型的所有键,其返回类型是联合类型。...对象上的不同属性,可以具有完全不同的类型,我们甚至不知道 obj 对象长什么样。 那么在 TypeScript 中如何定义上面的 prop 函数呢?...K 类型必须为 keyof T 联合类型的子类型。...那么当访问 todo 对象上不存在的属性时,会出现什么情况?...这就阻止我们尝试读取不存在的属性。 三、keyof 与对象的数值属性 在使用对象的数值属性时,我们也可以使用 keyof 关键字。
身上的可枚举属性浅拷贝到target: T上,因此返回值类型为T & U 交叉类型A & B既是A也是B,因此具有各个源类型的所有成员: interface A { a: string; } interface...: Date; } (摘自TypeScript/lib/lib.es2015.core.d.ts) Date构造函数接受一个number或string或Date类型的参数,对应类型为number | string...id是实例属性,类上不存在 x.id; // 类实例的类型 let y: typeof A.prototype; let z: A; // 二者类型等价 z = y; // 错误 prop是静态属性...,实例上不存在 z.prop; z.id; 也就是说,类实例的类型等价于构造函数prototype属性的类型。...后缀类型断言 既然Nullable类型实质上是联合类型,那么同样面临类型缩窄的问题。
当你对一个对象访问并不存在的属性时,JavaScript将会返回undefined,而不是报错。 在TypeScript严格模式下,这意味着下面几种情况。...; 在类型、接口或类的定义中,在属性名称中添加?将会把该属性标记为「可选」的。 type Foo = { bar?...如果你在IDE中把鼠标悬停在Foo上,你会看到TypeScript实际上已经把bar定义为number | undefined的联合类型。...而且也支持c对象,用来表明bar属性是undefined 。 TypeScript也会注意这段代码。在if子句中,会把bar属性的类型收窄为number。...而是string | undefined 的联合类型。
类型「unknown」上不存在属性「toUpperCase」。...}; 关于索引签名的最后一项要点是,其现在可以支持无限域原始类型的联合,具体包括: string number symbol 模板字符串模式 (例如hello-${string}) 参数为这些类型的联合的索引签名将脱糖为几个不同的索引签名...但您也可能在 TypeScript 4.4 上遇到如下错误: 类型'unknown'上不存在属性'message'。 类型'unknown'上不存在属性'name'。...类型'unknown'上不存在属性'stack'。 如果我们不想在 catch 子句中处理 unknown 变量,则可以始终添加明确的 : any 注释以声明不使用更严格的类型。...这通常会引发发下错误提示: 类型'unknown'上不存在属性'message'。 类型'unknown'上不存在属性'name'。 类型'unknown'上不存在属性'stack'。
总览 当我们试图访问一个类型为HTMLElement的元素上的value属性时,会产生"Property 'value' does not exist on type 'HTMLElement'"错误...为了解决该错误,在访问属性之前,使用类型断言将元素类型断言为HTMLInputElement。...HTMLElement | null ,并且value属性不存在于HTMLElement类型上。...联合类型 如果你想更精确地控制类型,你可以使用一个联合类型来设置类型为HTMLInputElement | null。...知道input变量在if块中的类型是HTMLInputElement,并允许我们直接访问其value属性。
当某个值是 any 类型的时候,你可以访问它的任意属性(这些属性也会是 any 类型),可以将它作为函数调用,可以将它赋值给任意类型的值(或者把任意类型的值赋值给它),或者是任何语法上合规的操作: let...JavaScript 中,如果你访问了一个不存在的属性,你将会得到 undefined 而不是一个运行时错误。...如果一个联合类型的每个成员都有一个公共的属性,那么你可以不需要进行收窄,直接使用该属性: // 返回值会被推断为 number[] | string function getFirstThree(x:...实际上这并不让人意外,“联合”这个名词来自于类型理论。联合类型 number | string 是由每个类型的值的联合组成的。...字面量推断 当你初始化一个变量为某个对象的时候,TypeScript 会假定该对象的属性稍后可能会发生变化。
数组与元组 创建一个数组很简单: const arr = [1]; 此时 TypeScript 将会推断 arr 类型为 number[]: arr.push('1'); // Error 当数组元素具有其它类型时...// 类型安全 字面量类型 在 JavaScript 基础上,TypeScript 扩展了一系列字面量类型,用来确保类型的准确性。..., { name: string } 类型中不存在 age 属性 let otherThing = { name: 'hello', age: 123 }; someThing = otherThing...{ name: string } 属性中不存在。...logName({ name: 'matt', job: 'being awesome' }); // Error: 对象字面量只能指定已知属性,`job` 属性在这里并不存在。
,以获得其所有属性键的类型,该类型是字符串字面量类型的联合 type TodoKeys = keyof Todo; // "id" | "text" | "due" 当然,各位也可以手动写出联合类型 "...} TypeScript 现在以推断 prop 函数的返回类型为 T[K],这个就是所谓的 索引类型查询 或 查找类型。...const text = prop(todo, "text"); // string const due = prop(todo, "due"); // Date 现在,如果传递一个 todo 对象上不存在的键会发生什么...image.png 编译器会报错,这很好,它阻止咱们试图读取一个不存在的属性。...不可否认,在返回类型中有大量的方括号,但是我们一直在寻找类型安全性。
答案:联合类型是一种表示一个值可以属于多种类型之一的方式。例如,如果函数接受字符串和数字作为参数,则可以将其键入为 function example(arg: string | number)。...当创建可能缺少值的结构或处理来自外部源的数据(其中某些字段可能不存在)时,这非常有用。 08、在定义对象形状时,您能区分interface和type吗?...答案:可区分联合(也称为标记联合)是一种结合了联合类型、文字类型和类型保护的模式。 当一个对象可以有多个形状但共享一个公共属性(通常是文字类型)时,可以使用它们,该属性可用于缩小其确切形状。...公共属性(通常称为“鉴别器”)允许我们在联合内的类型之间安全地切换,从而更轻松地使用此类对象。 12、继承在 TypeScript 中如何发挥作用?...答案:映射类型允许通过转换属性在现有类型的基础上创建新类型。它们遵循一种模式,您可以在其中迭代对象类型的属性并生成新类型。
数组与元组 创建一个数组很简单: const arr = [1]; 复制代码 此时 TypeScript 将会推断 arr 类型为 number[]: arr.push('1'); // Error...// 类型安全 复制代码 字面量类型 在 JavaScript 基础上,TypeScript 扩展了一系列字面量类型,用来确保类型的准确性。..., { name: string } 类型中不存在 age 属性 let otherThing = { name: 'hello', age: 123 }; someThing = otherThing...{ name: string } 属性中不存在。...logName({ name: 'matt', job: 'being awesome' }); // Error: 对象字面量只能指定已知属性,`job` 属性在这里并不存在。
TypeScript 2.1 增加了对 对象扩展运算和 rest 属性提案的支持,该提案在 ES2018 中标准化。可以以类型安全的方式使用 rest 和 spread 属性。...,以获得其所有属性键的类型,该类型是字符串字面量类型的联合 type TodoKeys = keyof Todo; // "id" | "text" | "due" 当然,各位也可以手动写出联合类型 "...} TypeScript 现在以推断 prop 函数的返回类型为 T[K],这个就是所谓的 索引类型查询 或 查找类型。...编译器会报错,这很好,它阻止咱们试图读取一个不存在的属性。...不可否认,在返回类型中有大量的方括号,但是我们一直在寻找类型安全性。
索引签名语法 索引签名的语法相当简单,看起来与属性的语法相似,但有一点不同。我们只需在方括号内写上键的类型,而不是属性名称:{ [key: KeyType]: ValueType }。...3.1不存在的属性 如果试图访问一个索引签名为 { [key: string]: string } 的对象的一个不存在的属性,会发生什么?...正如预期的那样,TypeScript 将值的类型推断为 string。...这样,TypeScript就会意识到你访问的属性可能不存在 3.2 string 和 number 键 假设有一个数字名称的字典: interface NumbersNames { [key:...乍一看,它们看起来很相似 我们知道,索引签名只接受 string、number 或 symbol 作为键类型。如果你试图在索引签名中使用,例如,字符串字面类型的联合作为键,这是一个错误。
那么结果为 true 的分支会将 x 收缩为具有可选属性或必需属性 value 的类型,而结果为 false 的分支则会将 x 收缩为具有可选属性或缺失属性 value 的类型。...而现在 Shape 已经是一个联合类型了,TypeScript 告诉我们 shape 可能是 Square,而 Square 是没有定义 radius 属性的!...当联合类型中的每个类型都包含一个字面量类型的公共属性的时候,TypeScript 会将其视为一个可辨识的联合类型,并通过收缩确认类型为联合类型的某个成员。...通过检查 kind 属性是否为 "circle",我们可以排除掉 Shape 中所有 kind 属性值不为 "circle" 的类型。也就是说,可以将 shape 类型收缩为 Circle 类型。...never 类型 在收缩类型的时候,你可以将联合类型减少到一个仅存的类型,这时候,你基本上已经排除了所有的可能性,并且没有剩余的类型可选了。
领取专属 10元无门槛券
手把手带您无忧上云