首页
学习
活动
专区
工具
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.6K20
  • TypeScript 官方手册翻译计划【一】:基础

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

    92010

    十三、异常、类型转换和 lambda

    它可能是作为基类设计的,但实际上很少被直接使用。 std::bad_typeid:当在typeid操作中使用了nullptr或指向非多态类型对象的指针时抛出。...std::bad_weak_ptr:当尝试访问std::weak_ptr管理的对象,但该对象已被销毁时抛出。它继承自std::exception。...std::range_error:当函数接收到一个无效范围时抛出(尽管在标准库中没有直接继承自std::range_error的常用异常,但它被用作一个基类)。...每种转换方式都有其特定的用途和限制。 隐式类型转换(Automatic Type Conversion) 隐式类型转换是编译器自动进行的类型转换,通常发生在赋值操作、算术运算或函数调用时。...例如,将一个整数赋值给浮点数变量时,整数会被隐式转换为浮点数。

    7510

    以淘宝店铺为例,谈谈 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.2K10

    【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。...该函数没有正常的完成,这意味着它会抛出一个错误,或者根本不会完成运行。 函数声明的类型推断 关于函数声明的返回类型推断有一个小问题。

    1.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 中的函数同样也非常的灵活,可以复制给变量,也可以作为参数或者是返回值

    89060

    一文读懂 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 会产生一个编译时错误。

    17.8K32

    数栈技术分享前端篇: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

    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.6K10

    TypeScript 快速入门

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

    1.6K10

    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
    领券