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

为什么TypeScript在返回隐式类型返回对象的无效属性时不抛出错误?

TypeScript在返回隐式类型返回对象的无效属性时不抛出错误的原因是因为它采用了结构类型系统。在结构类型系统中,对象的类型是由其属性和方法的集合来确定的,而不是由对象的具体类型来确定的。因此,当我们使用隐式类型返回对象时,TypeScript会根据对象的属性和方法来进行类型推断,而不会关注对象的具体类型。

当我们访问一个对象的属性时,TypeScript会检查该属性是否存在于对象的类型中。如果属性不存在于对象的类型中,TypeScript会认为该属性是无效的,但不会抛出错误。相反,它会将该属性的类型设置为undefined,并继续进行编译。

这种设计决策的优势在于它允许我们在开发过程中更加灵活地操作对象。我们可以在不事先定义对象类型的情况下,直接使用对象的属性和方法,并在后续的开发过程中逐渐完善对象的类型定义。这种灵活性使得我们能够更快地迭代和调试代码,提高开发效率。

然而,这种灵活性也带来了一些潜在的问题。由于TypeScript不会在访问无效属性时抛出错误,因此在编译阶段无法捕获到这类错误。为了避免这种情况,我们可以使用严格模式(strict)来启用更严格的类型检查,以确保对象的属性和方法的类型与其定义的类型一致。

总结起来,TypeScript在返回隐式类型返回对象的无效属性时不抛出错误是为了提供更灵活的开发体验,但也需要开发者在编码过程中注意类型的一致性,以避免潜在的错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript】超详细笔记教程【上】

": true, // 开启所有严格类型检查 "alwaysStrict": true, // 代码中注入'use strict' "noImplicitAny": true, // 不允许.../apply检查 "noImplicitThis": true, // 不允许this有any类型 "noUnusedLocals": true, // 检查只声明、未使用局部变量(只提示不报错...,因为new T返回是一个T对象, 任意值 Any表示你变量可以是任何值,Ts -> Js。。。...= { name: 'Alice', age: 18 } 上面的栗子,变量alice结构必须与接口Person相一致,如果我们写age,那么就会抛出错误类型 "{ name: string...比如我们变量alice添加属性address,那么就会抛出错误不能将类型“{ name: string; age: number; address: string; }”分配给类型“Person”。

1.1K30

TypeScript 官方手册翻译计划【四】:函数

和函数声明一样,如果没有指定参数类型,那么参数会被推断为 any 类型。 注意参数名是必需。...concat(arr2); } 如果调用该函数时候传入两个数组类型匹配,那么正常情况下是会抛出错误: const arr = combine([1, 2, 3], ["hello"]);...人们通常会写出下面的代码,并且不理解为什么抛出错误: function fn(x: string): void; function fn() { // ... } // 这里本应该可以传入任何参数...{ return; } JavaScript 中,没有返回函数会返回 undefined。...30, 40] const a = multiply(10, 1, 2, 3, 4); TypeScript 中,这些参数类型注解为 any[] 而不是 any,任何给定类型注解也必须是 Array

2.5K20

TypeScript 官方手册翻译计划【一】:基础

静态类型检查 还记得之前我们将字符串作为函数调用时,抛出 TypeError 错误吗?大多数开发者执行代码希望看到任何错误 —— 毕竟这些都是 bug!...也许你会觉得这是“理所当然”,并且你会觉得,访问对象上不存在属性,也会抛出一个错误。但恰恰相反,JavaScript 表现和我们预想不同,它返回是 undefined。...最后,你不得不花费时间解决类型检查器抛出错误,但问题在于,原始 JavaScript 代码本身就是可以运行为什么把它们转换为 TypeScript 代码之后,反而就不能运行了呢?...因为 JavaScript 中直接调用 Date 方法返回是字符串,而通过 new 去调用,则可以如预期那样返回一个 Date 对象。...启用 noImplicitAny 配置项,遇到被推断为 any 类型变量就会抛出一个错误

89410

以淘宝店铺为例,谈谈 TypeScript ESLint 规则集考量

explicit-module-boundary-types 函数与类方法返回值需要被显指定,而不是依赖类型推导,如: const foo = (): Foo => {}; 为什么:通过显指定来直观区分函数功能...,如副作用等,同时显指定函数返回值也能在一定程度上提升 TypeScript Compiler 性能。...为什么:逻辑或 || 会将 0 与 "" 视为 false 而导致错误应用默认值,而可选链相比于逻辑与 && 则能够带来更简洁语法(尤其是属性访问嵌套多层,或值来自于一个函数,如 document.querySelector...推荐配合 tsconfig --noImplicitAny (检查 any)来尽可能保证类型完整与覆盖率。...并且会在下一行实际不存在错误抛出一个错误

2.7K30

TypeScript never 类型

它用于表示返回函数返回类型:例如,永远循环函数,始终抛出异常信号函数等。 因为底部类型被用于表示不会正常返回,一般没有返回值。...(这并不一定意味着该程序无法终止;子例程可以终止而返回其调用者,或通过某种其他方式退出); 作为错误指示器。...例如, never 类型是那些总是会抛出异常或根本就不会有返回函数表达式或箭头函数表达式返回类型。此外,变量也可能是 never 类型,当它们被永不为真的类型保护所约束。...尽管两者看起来很相似,但是它们代表了两个不同概念: 没有显返回函数会返回 undefined。尽管我们通常说这样函数 “什么也返回”,但实际上它是会返回。...在这些情况下,我们通常忽略返回值。 TypeScript 中这些函数返回类型被推断为 void。 具有 never 返回类型函数永不返回。它也返回 undefined。

4.1K10

TypeScript 演化史 — 第二章】基于控制流类型分析 和 只读属性

因此,没有从 command 变量联合类型中删除字符串类型,并产生以下编译错误: Property 'join' does not exist on type 'string | string[]...严格 null 检查模式下,undefined 类型会自动添加到可选属性联合类型中,因此我们不必显将其写出。 明确赋值分析 基于控制流另一个新特性是明确赋值分析。...因为 x 是只读,如果尝试这么,TypeScript 编译器会给出错误提示: image.png 相反,moveX 应该返回一个具有更新属性 point,它类似这样: function...如下所示,有一个 Circle 类,它有一个只读 radius 属性和一个get area 属性,后者是只读,因为没有 setter: class Circle { readonly radius...如下所示,有一个 Circle 类,它有一个只读 radius 属性和一个get area 属性,后者是只读,因为没有 setter: class Circle { readonly radius

2K10

TypeScript 演化史 — 第三章】标记联合类型 与 never 类型

使用标记联合类型构建 Redux 操作 标记联合类型真正发挥作用用例是 TypeScript 应用程序中使用 Redux 。...函数表达式或箭头函数没有返回类型注解,如果函数没有 return 语句,或者只有 never 类型表达式 return 语句,并且如果函数是不可执行到终点(例如通过控制流分析决定),则推断函数返回类型是...虽然这两者看起来很相似,但它们是两个不同概念: 没有显返回函数将返回 undefined 。虽然我们通常会说这样函数“返回任何东西”,但它会返回。...在这些情况下,我们通常忽略返回值。这样函数 TypeScript 中被推断为有一个 void 返回类型。 具有 never 返回类型函数永不返回。它也返回 undefined。...该函数没有正常完成,这意味着它会抛出一个错误,或者根本不会完成运行。 函数声明类型推断 关于函数声明返回类型推断有一个小问题。

1K20

数栈技术分享前端篇:TS,看你哪里逃~

(笔者一直就把 TypeScript 看作 JavaScript Lint) 那么问题来了,为什么 TS 一定要设计成静态?...: 不管是中文还是英文文档,primitives/元语/元组 这几个名词都频繁出镜,笔者理解白话:希望类型约束定义,使用是字面量而不是内置对象类型,官方文档: ​ let a: string...type dayOff = string | number | boolean 联合类型推导可能会导致错误,遇到相关问题请参考语雀 code and tips —— 《TS推导》....值得注意是,如果访问共有的属性时候,会报错,访问共有属性不会.上个最直观demo function dayOff (value: string | number): number {...Typescript 存在两种模式,区分逻辑是,文件内容包包含 import 或者 export 关键字 。

2K30

TypeScript介绍和使用

项目推行TypeScript有什么好处 对于我们团队中推行 TypeScript ,可能大家都有同样疑问: 我们为什么要这么做? 或者说,我们这么做,有什么好处?...从语言类型检查时机来看 我们所编写代码执行层面,按照类型检查时机来分类,可以分为动态类型和静态类型 动态类型 动态类型是指在运行时才会进行类型检查,这种语言类型错误往往会导致运行时错误。...a 类型为 对象 3、最后我们执行了运算符 + 号操作,将对象与数值相加,Js 通过类型转换,将变量 a 最终类型改变为 字符串 4、这一波花里胡哨操作下来也并没有产生报错!!!...这一切都源于 Javascrip 灵活特性: 无类型约束 他没有类型约束,一个变量可能初始化时是数值,过一会儿又被赋值为对象 转换 由于类型转换存在,有的变量类型很难再运行前就确定...基于原型 JavaScript 是基于原型面向对象编程,原型上属性或方法可以在运行时被修改 函数 JavaScript 中函数同样也非常灵活,可以复制给变量,也可以作为参数或者是返回

85960

一文读懂 TS 中 Object, object, {} 类型之间区别

我们可以看到,如果我们创建一个返回其参数函数: 传入一个 Object 对象实例,它总是会满足该函数返回类型 —— 即要求返回值包含一个 toString() 方法。...,TypeScript 编译器不会提示任何错误: const obj2: object = { toString() { return 123 } }; 另外在处理 object 类型和字符串索引对象类型赋值操作...当你试图访问这样一个对象任意属性TypeScript 会产生一个编译错误: // Type {} const obj = {}; // Error: Property 'prop' does...原型链地使用: // Type {} const obj = {}; // "[object Object]" obj.toString(); JavaScript 中创建一个表示二维坐标点对象很简单...4.3 {} 类型 {} 类型:它描述了一个没有成员对象。当你试图访问这样一个对象任意属性TypeScript 会产生一个编译错误

15.8K21

TypeScript 官方手册翻译计划【十二】:类

= 0; pt.y = 0; 和其它特性一样,这里类型注解也是可选,但如果没有指定类型,则会采用 any 类型。...super(); } } JavaScript 中,忘记调用 super 是一个常见错误,但 TypeScript 会在必要给你提醒。...对于访问器,TypeScript 有一些特殊推断规则: 如果 get 存在而 set 不存在,那么属性会自动成为只读属性 如果没有指定 setter 参数类型,那么会基于 getter 返回类型去推断参数类型... ES2015 中,返回实例对象构造器会地将 this 值替换为 super(...) 任意调用者。有必要让生成构造器代码捕获 super(...)...) { return "hello " + this.message; } } 你可能会发现: 调用子类之后返回实例对象,其方法可能是 undefined,所以调用 sayHello 将会抛出错误

2.6K10

TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入

如果 TypeScript 为 let 变量推断一个字面量类型,那么尝试为指定值以外任何值赋值都会在编译产生错误。...any 错误 这样做一个很大好处是,当使用--noImplicitAny运行时,你将看到较少any错误。...any错误只会在编译器无法知道一个没有类型注解变量类型才会报告。...} } 更好地检查表达式操作数中 null/undefined TypeScript 2.2中,空检查得到了进一步改进。TypeScript 现在将带有可空操作数表达式标记为编译错误。...咱们例子中,它初始化 tag 属性。 混合构造函数类型指仅有单个构造函数签名,且该签名仅有一个类型为 any[] 变长参数,返回值为对象类型.

4.5K10

数栈技术分享前端篇:TS,看你哪里逃~

(笔者一直就把 TypeScript 看作 JavaScript Lint) 那么问题来了,为什么 TS 一定要设计成静态?...: 不管是中文还是英文文档,primitives/元语/元组 这几个名词都频繁出镜,笔者理解白话:希望类型约束定义,使用是字面量而不是内置对象类型,官方文档: let a: string =...type dayOff = string | number | boolean 联合类型推导可能会导致错误,遇到相关问题请参考语雀 code and tips —— 《TS推导》....值得注意是,如果访问共有的属性时候,会报错,访问共有属性不会.上个最直观demo function dayOff (value: string | number): number {...Typescript 存在两种模式,区分逻辑是,文件内容包包含 import 或者 export 关键字 。

2.7K10

4000字讲清 《深入理解TypeScript》一书 【基础篇】

WARNING 请注意,这种错误提示,只会发生在对象字面量上 允许分配而外属性: 一个类型能够包含索引签名,以明确表明可以使用额外属性: let x: { foo: number, [x: string...它自然被分配一些例子: 一个从来不会有返回函数(如:如果函数内含有 while(true) {}); 一个总是会抛出错误函数(如:function foo() { throw new Error...当一个函数没有返回,它返回了一个 void 类型,但是,当一个函数根本就没有返回(或者总是抛出错误),它返回了一个 never,void 指可以被赋值类型 strictNullChecking...为 false ),但是 never 不能赋值给其他任何类型,除了 never TypeScript 索引签名 JavaScript 一个对象类型索引签名上会调用 toString 方法...,它将会抛出一个错误

1.9K30

TypeScript 快速入门

类型语言中不允许任意类型转换,而弱类型语言则允许任意数据类型转换 变量类型允许随时改变特点,不是强弱类型差异 静态类型与动态类型类型检查) 静态类型:一个变量声明时它类型就是明确...抛出异常 这是一个隐患 而强类型语言直接在语法层面上抛出错误 setTimeout(() => { obj.foo(); }, 1000); //如下 传递不同类型参数 函数作用就完全不同了...//对象属性名会自动转换为字符串 const obj = {}; obj[true] = 100; console.log(obj['true']);//对对象索引器错误用法 强类型优势: 错误更早暴露...缺点一:语言本身多了很多概念 缺点二:项目初期,会增加一些成本 TypeScript 属于渐进 TypeScript 最终会编译成JavaScript并且支持到ES3标准 yarn add typescript...类 描述一类事物抽象特征 ES6以前通过 函数+原型来模拟类 class ES6中就添加了这一个特性,而TypeScriptES6基础上对class添加了访问修饰符,类属性必须要先声明属性并且必须有一个初始值

1.5K10
领券