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

为什么在导入的对象上运行不存在的方法时,TypeScript不会给我一个编译时错误?

在导入的对象上运行不存在的方法时,TypeScript不会给出编译时错误的原因是因为 TypeScript 是一种结构化类型系统,它的类型检查是基于对象的形状而不是具体的类或接口。当我们导入一个对象时,TypeScript 只会检查该对象是否具有我们在代码中使用的属性和方法,而不会检查该对象是否是特定类或接口的实例。

这种设计决策是为了增加 TypeScript 的灵活性和兼容性。在 JavaScript 中,对象的属性和方法是动态的,可以在运行时进行修改和扩展。TypeScript 为了与 JavaScript 的动态特性保持一致,允许我们在导入的对象上运行不存在的方法,而不会在编译时报错。

然而,尽管 TypeScript 不会在编译时报错,但在运行时会抛出一个错误,提示我们该方法不存在。这是因为 TypeScript 会生成 JavaScript 代码,而 JavaScript 在运行时会检查对象的属性和方法是否存在。如果我们在运行时调用了一个不存在的方法,JavaScript 引擎会抛出一个异常。

为了避免在运行时出现错误,我们可以使用 TypeScript 的类型断言(Type Assertion)来告诉编译器我们确信该方法存在,或者使用条件语句在运行时进行检查。另外,良好的代码规范和文档注释也可以帮助开发人员避免调用不存在的方法。

总结起来,TypeScript 不会在导入的对象上运行不存在的方法时给出编译时错误,是为了保持与 JavaScript 的动态特性一致,并提供更大的灵活性和兼容性。但我们需要在运行时自行确保调用的方法存在,以避免运行时错误。

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

相关·内容

你不知道 「 import type 」

背景 TypeScript 3.8 带来了一个新特性:仅仅导入 / 导出声明。 一篇文章 中, 我们使用了这个特性,解决了: 引入类型文件报文件不存在问题。.../service.js 中代码不会被执行,导致在运行时会被中断。 TypeScript 3.8 版本中,我们添加了一个仅仅导入/导出 声明语法来作为解决方式。...与此相似,export type 仅仅提供一个用于类型导出, TypeScript 输出文件中,它也将会被删除。 值得注意是,类在运行时具有值,设计时具有类型。它使用与上下文有关。...error,它将会保留所有的导入(与 preserve 选项相同)语句,但是当一个导入仅仅用于类型将会抛出错误。...因此,babel 也被迫错误地将此声明保留了转换后代码中。 为什么会这样? Babel转译过程中一次明确地处理一个文件。

4.2K61

TypeScript 4.4 RC版来了,正式版将于月底发布

以上示例不会引发任何错误!当 TypeScript 发现我们测试某个常量值,它会执行一些额外操作以查看其中是否包含类型守卫。...} } 请注意,新机制深度是有极限——TypeScript 检查这些条件不会过度深入,但对大多数日常检查来说应该是足够了。...但您也可能在 TypeScript 4.4 遇到如下错误: 类型'unknown'不存在属性'message'。 类型'unknown'不存在属性'name'。...完成列表中显示自动导入真实路径 Visual Studio Code 等编辑器显示完成列表,具有自动导入完成结果会在显示中包含对于特定模块路径。...这通常会引发发下错误提示: 类型'unknown'不存在属性'message'。 类型'unknown'不存在属性'name'。 类型'unknown'不存在属性'stack'。

2.5K20

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

为什么:逻辑或 || 会将 0 与 "" 视为 false 而导致错误应用默认值,而可选链相比于逻辑与 && 则能够带来更简洁语法(尤其是属性访问嵌套多层,或值来自于一个函数,如 document.querySelector...为什么:虽然 TypeScript 是允许使用各种合法表达式作为枚举成员,但由于枚举编译结果拥有自己作用域,因此可能导致错误赋值,如: const imOutside = 2; const b...并且会在下一行实际不存在错误时抛出一个错误。...值导入与类型导入 TypeScript 中使用不同堆空间来存放,因此无须担心循环依赖(所以你可以父组件导入子组件,子组件导入定义父组件中类型这样)。...exhaustiveCheck: never = strOrNumOrBool; throw new Error(`Unknown input type: ${_exhaustiveCheck}`); } 这里通过编译运行时做了两重保障

2.7K30

Node.js 项目 TypeScript 改造指南

本文讲的是如何将一个 Node.js 项目使用 TypeScript 进行改造,包括目录结构调整、TypeScript-ESLint 配置、tsconfig 配置、调试、常见错误处理等。...) 意思是不推荐这种导入写法,因为这种 commonjs 写法导出来对象是 any,没有类型支持。...所幸,tsconfig 提供了一个配置allowSyntheticDefaultImports,意思是允许从没有设置默认导出模块中默认导入,需要注意是,这个属性并不会对代码生成有任何影响,仅仅是给出提示.../explicit-function-return-type),意思是方法需要有返回值,只是警告,不影响项目运行,先忽略,后续再完善。...函数中使用this 根据写法不同,大概会有以下4种报错: 1.类型“NodeModule”不存在属性“name”。

8.2K32

Node.js项目TypeScript改造指南

本文讲的是如何将一个 Node.js 项目使用 TypeScript 进行改造,包括目录结构调整、TypeScript-ESLint 配置、tsconfig 配置、调试、常见错误处理等。...) 意思是不推荐这种导入写法,因为这种 commonjs 写法导出来对象是 any,没有类型支持。...所幸,tsconfig 提供了一个配置allowSyntheticDefaultImports,意思是允许从没有设置默认导出模块中默认导入,需要注意是,这个属性并不会对代码生成有任何影响,仅仅是给出提示.../explicit-function-return-type),意思是方法需要有返回值,只是警告,不影响项目运行,先忽略,后续再完善。...函数中使用this 根据写法不同,大概会有以下4种报错: 1.类型“NodeModule”不存在属性“name”。

4.3K20

Node.js项目TypeScript改造指南

本文讲的是如何将一个 Node.js 项目使用 TypeScript 进行改造,包括目录结构调整、TypeScript-ESLint 配置、tsconfig 配置、调试、常见错误处理等。...) 意思是不推荐这种导入写法,因为这种 commonjs 写法导出来对象是 any,没有类型支持。...所幸,tsconfig 提供了一个配置allowSyntheticDefaultImports,意思是允许从没有设置默认导出模块中默认导入,需要注意是,这个属性并不会对代码生成有任何影响,仅仅是给出提示.../explicit-function-return-type),意思是方法需要有返回值,只是警告,不影响项目运行,先忽略,后续再完善。...函数中使用this 根据写法不同,大概会有以下4种报错: 1.类型“NodeModule”不存在属性“name”。

4.5K10

ECMAScript Modules Node.js 中支持与使用

2019 年 4 月份,Node.js 官方团队发布 Node.js 12 ,也给我们带来了最新 ECMAScript Modules 支持。...早在 ES6 规范推出,我们通过 Babel/TypeScript 等工具便已能在项目中使用该 Feature,那为什么我们还需要关注该 Feature Node.js 实现与具体使用呢?...这一点非常重要,因为 Babel 与 TypeScript 对 ECMAScript Modules ,实际编译成 Node.js 所支持 CommonJS 规范,从而使得最终产物可以 Node.js...且由于底层缺失对于 ECMAScript Modules 强约束(因为还不存在),所以大家写法也都是五花八门,只能最终编译成 CommonJS 运行即可。...而在 ES Modules 规范下,导入一个模块,我们需要提供确切文件拓展名。 这一点虽然对比现在方案缺失了灵活性,但却使得整体模块依赖关系可以在编译就确定,而不需要等到运行时。

3K30

旧项目TypeScript改造问题与解决方案记

### Window对象属性赋值报错 与上一个情况类似,我们给一个对象中赋值一个不存在属性,会出现编辑器和编译报错: window.a = 1; // 终端编译报错:TS2339: Property...我们windows使用时增加一个类型转换,即`(window as any).a = 1;`。这样就能够保证编辑器和编译不会出错。...`tsconfig.json`配置文件中增加lib。此方法原理是让TypeScript编译引用外部Promise对象,因此在编译不会报错。...这是由于编辑器和编译不知道当前代码运行环境导致。 因此,我们解决这个问题思路有两种: 1. `tsconfig.json`配置文件中增加lib。...## TypeScript局部替换 进行重构改造时候,我们最开始可能只能逐个模块进行替换。我们需要新TypeScript文件和旧JavaScript文件能够和平共存进行编译运行

4.9K10

会写 TypeScript 但你真的会 TS 编译配置吗?

但是 TypeScript 并不可以直接运行,而是需要转换成 JavaScript 代码才可以 Node.js 或浏览器环境下执行,因此我们需要通过“编译器”将 TS 代码转换为 JS 代码。...2.1 files files 字段用于指明需要 tsc 编译一个或多个 ts 文件,例如: { "files": ["index.ts", "global.d.ts"], } 当指定文件或文件夹不存在...例如我们代码会使用到浏览器中一些对象 window、document,这些全局对象 API 对于 TypeScript Complier 来说是不能识别的: lib 未显示引入 DOM 会提示类型错误...DOM 即浏览器环境下一些默认类型定义,即可在代码中使用,window、document 等浏览器环境中对象,TS 在运行时以及编译不会报类型错误。...,抛出错误 "noUnusedParameters": true, // 有未使用参数,抛出错误 "noImplicitReturns": true, // 并不是所有函数里代码都有返回值

3.4K41

Vue 中使用 TypeScript 一些思考(实践)

这意味着我们可以使用 someProp 任意属性(存在或者是不存在)都可以通过编译。为了防止此种情况发生,我们将会给 Prop 添加类型注释。...一些其它 做为 Vue 中最正统方法(与标准形式最为接近),Vue.extends() 有着自己优势, VScode Vetur 插件辅助下,它能正确提示子组件 Props: ?...导入 .vue 为什么会报错? 当你 Vue 中使用 TypeScript ,所遇到一个问题即是 ts 文件中找不到 .vue 文件,即使你所写路径并没有问题: ?...: declare module '*.vue' { import Vue from 'vue' export default Vue } 复制代码 但是,这引起了另一个问题,当我们导入一个不存在...当我尝试 .vue 文件中导入已存在或者不存在 .vue 文件,却得到不同结果: 文件不存在: ? 文件存在: ? 文件不存在,引用 Vue 声明文件。

3.2K30

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

如果 TypeScript 为 let 变量推断一个字面量类型,那么尝试为指定值以外任何值赋值都会在编译产生错误。...以前,编译器过于严格,当导入一个没有附带类型定义模块,会出现一个错误: image.png 从 TypeScript 2.1 开始,如果模块没有类型声明,编译器将不再报错。...(否则,将无法为导入模块提供类型) 对于没有声明文件模块导入使用了--noImplicitAny编译参数后仍将被标记为错误。...隐式any错误只会在编译器无法知道一个没有类型注解变量类型才会报告。...} } 更好地检查表达式操作数中 null/undefined TypeScript 2.2中,空检查得到了进一步改进。TypeScript 现在将带有可空操作数表达式标记为编译错误

4.5K10

TypeScript 4.2 正式发布:更智能类型别名保留,声明缺失帮助函数,还有许多破坏性更新

in操作符右侧使用一个对象类型是一个运行错误。...它不会阻止你传入其它“具体”类 / 构造函数——这实际只是表示没有直接运行构造器意图,因此传入任何类类型都是安全。 这个特性允许我们以一种支持抽象类方式写 mixin 工厂。...tsc --explainFiles 当使用此选项TypeScript 编译器将给出一些非常详细输出,说明文件为什么会出现在程序中。...尽管很明显movieWatchCount中肯定有一些字符串不存在,但是由于undefined存在,TypeScript 早期版本认为对象可选属性不能用兼容索引符号赋值。...4.2 中,导入路径扩展名中包含.d.ts现在是一个错误

3.2K20

我们为什么要学习TypeScript

使用不存在变量、函数或成员方法一个不确定类型当做一个确定类型处理 使用null或者undefined成员,JS开发错误排名第一个就是它 当一个函数返回一个对象,这个对象里有name属性,...但由于程序出错,没有返回对象,再使用name属性就会报错,如下: 开发过程中,会遇到各种各样错误,由于我们是人,不是机器,没有办法避免这样错误,既然没有办法避免,那好歹在出错地方提示我一下啊...js中单词写错,那么明显错误都不提示!其实是因为脚本里面可以引用其它脚本,其它脚本中有可能有这个错误变量名,所以js不敢报错。那么JS为什么不能给我们提示错误!...这时TypeScript出来了,TypeScript就能解决这些问题,我们为什么要学ts,实际是为了提高我们开发周期,提高效率,能够缩减我们项目周期,少犯一些莫名其妙错误 TypeScript语言特点...代码运行之前有一个编译过程, 需要注意是js代码在运行过程中TS是不参与类型检查 无论是浏览器环境,还是node环境,无法直接识别ts代码,可以只用tsc将ts代码转换为es代码,tsc是TS编译

64430

细数这些年被困扰过 TS 问题

其中 T 代表 Type,定义泛型通常用作第一个类型变量名称。但实际 T 可以用任何有效名称代替。...四、如何理解装饰器作用 TypeScript 中装饰器分为类装饰器、属性装饰器、方法装饰器和参数装饰器四大类。装饰器本质是一个函数,通过装饰器我们可以方便地定义与对象相关元数据。...因此以上代码可以直接在 TypeScript 中使用,但当 TypeScript 编译器开启 noImplicitAny 配置项,以上代码会提示以下错误信息: Parameter 'x' implicitly...很明显 Combinable 和 number 类型对象不存在 split 属性。问题又来了,那如何解决呢?这时我们就可以利用 TypeScript 提供函数重载。...7.3 {} 类型 {} 类型描述了一个没有成员对象。当你试图访问这样一个对象任意属性TypeScript 会产生一个编译错误

15K73

Typescript真香秘笈

但是反过来,用typescript语法编写代码,却不能在浏览器或者Node环境下直接运行,因为typescript本身并不是Ecmascript标准语法。 3. 为什么要使用Typescript?...设置为any类型后,相当于告诉typescript编译器跳过这个变量检查,因此可以访问、设置这个变量任何属性,或者给这个变量赋任何值,编译器都不会报错。...我们思考一下,javascript中,一个对象是不是可能有多重身份。 例如说,一个函数,它可以作为一个普通函数执行,它也可以是一个构造函数。同时,函数本身也是对象,它也可以有自己属性。...安装ts-node: npm i ts-node -D 运行ts文件:npx ts-node script.ts 由于ts-node实际是在运行阶段对于ts文件进行编译,所以一般不在生产环境中直接使用...ts-node,而是用tsc直接编译一遍,就不会运行编译开销了。

5.6K20

攀爬TS之路(一) 原始数据类型、任意值类型

TypeScript是静态类型 静态类型:在编译阶段就能确定变量类型,能在编译阶段暴露大部分错误 动态类型:在运行时才会确定变量类型,会导致更多错误(如类型匹配错误) TS是静态类型。...同样代码JS中运行阶段报错,TS中编译阶段报错。...如1+'1'不会报错 TS和JS都是弱类型 console.log(2 + '1') TS和JS中都不会报错,因为TS是完全兼容JS不会修改JS运行特性,所以它们都是弱类型。...(myNumber.a.b) // 运行时报错 也允许调用任何方法(有错误也是运行时才会报错) let myNumber: any = 1 myNumber.sayHello() myNumber.sayHello...().sayHi() 因为如果一个变量是任意值类型的话,那么对它操作,返回结果类型都是任意值,而且任意值也就意味着有可能会是对象,所以是没法在编译暴露出错误

69130

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

也许你会觉得这是“理所当然”,并且你会觉得,访问对象不存在属性,也会抛出一个错误。但恰恰相反,JavaScript 表现和我们预想不同,它返回是 undefined。...所以设计TypeScript不会对你造成阻碍。当然,随着时间推移,你可能希望对错误采取更具防御性措施,同时也让 TypeScript 采取更加严格行为。...因为 JavaScript 中直接调用 Date 方法返回是字符串,而通过 new 去调用,则可以如预期那样返回一个 Date 对象。...这也是为什么 TypeScript 首先需要一个编译器 —— 它需要经过编译,才能去除或者转换 TypeScript 独有的代码,从而让这些代码可以浏览器运行。...启用 noImplicitAny 配置项,遇到被隐式推断为 any 类型变量就会抛出一个错误

89310
领券