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

为什么TypeScript的类型保护在父作用域中的工作方式不同?

TypeScript的类型保护在父作用域中的工作方式与在子作用域中略有不同,这主要是由于TypeScript的类型推断和作用域规则。

类型保护的基本概念

类型保护是一种机制,允许你在运行时检查变量的类型,并根据检查结果缩小变量的类型范围。TypeScript提供了几种内置的类型保护,如typeofinstanceof和自定义类型保护函数。

作用域的影响

在TypeScript中,变量的作用域决定了其可见性和生命周期。父作用域和子作用域中的变量可能会有不同的类型推断结果,这会影响类型保护的行为。

1. 变量提升(Hoisting)

JavaScript中的变量提升可能导致在父作用域中声明的变量在子作用域中提前可见。TypeScript编译器会考虑这一点,并在类型推断时进行相应的调整。

代码语言:javascript
复制
function example() {
    if (typeof x === "number") {
        let y = x; // x 在这里被推断为 number 类型
    }
    console.log(y); // y 在这里不可见,因为它的作用域仅限于 if 块内
}

2. 块级作用域

TypeScript支持块级作用域,这意味着在块内声明的变量仅在该块内可见。这会影响类型保护的行为,特别是在嵌套块中。

代码语言:javascript
复制
function example() {
    let x: number | string;
    if (typeof x === "number") {
        let y = x; // x 在这里被推断为 number 类型
    } else {
        let y = x; // x 在这里被推断为 string 类型
    }
    console.log(y); // y 在这里不可见,因为它的作用域仅限于各自的 if 块内
}

3. 类型推断的上下文

TypeScript编译器会根据变量的使用上下文推断其类型。在父作用域中,变量的类型可能受到更广泛的上下文影响,而在子作用域中,变量的类型可能受到更具体的上下文影响。

代码语言:javascript
复制
function example(x: number | string) {
    if (typeof x === "number") {
        let y = x; // x 在这里被推断为 number 类型
    } else {
        let y = x; // x 在这里被推断为 string 类型
    }
    console.log(y); // y 在这里不可见,因为它的作用域仅限于各自的 if 块内
}

示例分析

考虑以下示例:

代码语言:javascript
复制
function example(x: number | string) {
    if (typeof x === "number") {
        let y = x; // x 在这里被推断为 number 类型
        console.log(y.toFixed(2)); // 正确,因为 y 是 number 类型
    } else {
        let y = x; // x 在这里被推断为 string 类型
        console.log(y.toUpperCase()); // 正确,因为 y 是 string 类型
    }
    console.log(y); // 错误,因为 y 在这里不可见
}

在这个例子中,变量y在各自的if块内被声明和推断为不同的类型。在父作用域中,y是不可见的,因为它的作用域仅限于各自的块内。

总结

TypeScript的类型保护在父作用域中的工作方式不同,主要是由于变量作用域和类型推断的影响。理解这些规则有助于编写更健壮和可维护的TypeScript代码。

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

相关·内容

Java中为什么不同返回类型不算方法重载?

doSomething } public void method(Integer id, String name) { // doSomething } } 为什么不同返回类型不算方法重载...从方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名一部分呢?...方法"); } } 以上程序执行结果如下图所示: 从上述执行结果可以看出,方法重载第四匹配原则是,依次向上匹配方法调用。...总结 同一个类中定义了多个同名方法,但每个方法参数类型或者是参数个数不同就是方法重载。方法重载典型使用场景是 String 中 valueOf 方法,它有 9 种实现。

3.4K10

Moonlight:一种识别生物标志物不同肿瘤类型和分期中作为癌基因或肿瘤抑制因子多种作用方法

作者给定脚本文件中给出了使用方法,具体如下: 3.1.1 TCGA数据下载 方式一:按癌症类型和数据类型搜索 [Gene expression] dataFilt <- getDataTCGA(cancerType...Methylation") { …… } } 方式二:按癌症类型和数据类型搜索...(DEGmatrix),以及3.6步骤中PRA输出结果(dataPRA,含OCG),另外以及CScape类似于索引文件输入(这个部分为什么不作为R包内置嵌入,而要人工输入?)。...这里提供文件索引R包中没有找到,后续CScape-somatic网页中找到了这个数据,链接如下http://cscape-somatic.biocompute.org.uk/#download;...Moonlight2R更新版本中,moonlight函数并没有提供获取MAF矩阵函数,因此这部分报错是预料之中,但是让我意外是,更新后Moonlight 还是出现了和之前差不多报错,这……

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

    方法体中使用不合规名字,将会被视为是访问邻近作用域中变量: let x: number = 0; class C { x: string = "hello"; m() {...从 TypeScript 4.3 开始,访问器 getter 和 setter 可以使用不同类型。...语法访问基类方法。注意,由于 JavaScript 类只是一个简单查找对象,所以不存在“类字段”概念。 TypeScript 强制认为派生类总是基类一个子类。...跨层级访问受保护成员 对于通过一个基类引用访问受保护成员是否合法,不同 OOP 语言之间存在争议: class Base { protected x: number = 1; } class...关于 C# 为什么会认为这段代码是不合法,可以阅读这篇文章了解更多信息:为什么我无法一个派生类中去访问一个受保护成员?

    2.6K10

    TypeScript 官方手册翻译计划【十三】:模块

    反过来,一个不包含顶层 import 或者 export 声明文件会被视为一个脚本,它内容可以全局作用域中访问到(因此对模块也是可见)。 模块自身作用域而非全局作用域中执行。...一个脚本文件中声明变量和类型会位于共享全局作用域中,而且通常情况下,你会使用 outFile 编译选项将多个输入文件合并为一个输出文件,或者使用 HTML 文件中多个 标签去(...即使你编写代码时候采用是 ES 模块语法,简要了解一下 CommonJS 语法工作方式也有助于简化你调试过程。...TypeScript 提供了一个编译选项 esModuleInterop,以减少这两组不同约束之间冲突。...Node 策略则复刻了 Node.js CommonJS 模式下工作方式,并提供了额外 .ts 和 .d.ts 检查。

    1.1K20

    TypeScript进阶(一)深入理解类和接口

    通过使用 super 关键字调用构造函数,我们可以子类中访问属性和方法。 抽象类 抽象类是一种不能被实例化类,它只能被继承。抽象类可以包含抽象方法,这些方法只有声明,没有具体实现。... TypeScript 中,我们可以使用字符串或数字作为索引类型。 索引签名可以是字符串或数字类型,它们分别对应于对象属性名和数组索引。...通过使用 this 指向约束,我们可以确保函数中只能访问特定类型属性和方法。 this 指向约束通常与箭头函数一起使用,因为箭头函数没有自己 this 值,它会继承外部作用域中 this 值。...使用箭头函数时要注意外部作用域中 this 值是否符合预期。...increment() 方法使用了 this 指向约束,确保只能访问 Counter 类属性。logCount() 方法是一个箭头函数,它继承了外部作用域中 this 值。

    37310

    typescript 和class 类

    语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时静态类型检查。...2.为什么使用TypeScript JavaScript超集 支持所有原生JavaScript语法 强类型语言 现在很多主流语言都是强类型,而这点也一直是JavaScript所被人诟病地方。...TypeScript 支持继承类,即我们可以创建类时候继承一个已存在类,这个已存在类称为类,继承它类称为子类。...true 访问控制修饰符 TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法访问。TypeScript 支持 3 种不同访问权限。...protected : 受保护,可以被其自身以及其子类和类访问。 private : 私有,只能被其定义所在类访问。

    1.3K30

    内网渗透测试基础学习笔记

    内网基础知识 1.0工作组(Work Grou) 将不同计算机按功能列入到不同工作组中。工作组没有集中管理作用,工作组中所有的计算机都是对等。工作组不受密码保护。一个账户只能登陆到一台计算机。...每一台计算机都在本地存储用户帐户。 2.0 域 (Domain) 域(Domain)是一个有安全边界计算机合集,不同域中不同用户无法访问不同域中资源。...工作组与域分别 其实域和工作组在结构上很相似,只是表现形式有些不同: 1、工作组:只能将数量不多电脑连成一个可互相共享资源网络,在这种工作方式下,信息安全保护只能靠给共享信息设置密码或将使用权限设置给特殊用户来实现...域树中域和子域间自动建立一种双向可传递信任关系。 2.1.3域森林 多个域树通过建立信任关系组成集合。 ?...不能登录,用户就不能访问服务器上有权限保护资源,只能以对等网用户方式访问Windows共享资源,这样就一定程度上保护了网络上资源。

    68520

    TypeScript 中类理解及应用场景

    ,这个过程称之为方法重写,通过super关键字是对直接引用,该关键字可以引用属性和方法,如下: class PrinterClass { doPrint():void {...} } 修饰符 可以看到,上述形式跟ES6十分相似,typescript在此基础上添加了三种修饰符: 公共 public:可以自由访问类程序里定义成员 私有 private:只能够该类内部进行访问...受保护 protect:除了该类内部可以访问,还可以子类中仍然可以访问 私有修饰符 只能够该类内部进行访问,实例对象并不能够访问 并且继承该类子类并不能访问,如下图所示: 受保护修饰符 跟私有修饰符很相似...,实例对象同样不能访问受保护属性,如下: 有一点不同是 protected 成员子类中仍然可以访问 除了上述修饰符之外,还有只读修饰符 只读修饰符 通过readonly关键字进行声明,只读属性必须在声明时或构造函数里被初始化...Square { static width = '100px' } console.log(Square.width) // 100px 上述类都能发现一个特点就是,都能够被实例化, typescript

    16310

    30个小知识让你更清楚TypeScript

    TypeScript类型断言工作方式类似于其他语言中类型转换,但没有 C# 和 Java 等语言中可能类型检查或数据重组。类型断言对运行时没有影响,仅由编译器使用。...类型断言本质上是类型转换软版本,它建议编译器将变量视为某种类型,但如果它处于不同形式,则不会强制它进入该模型。 9、如何在 TypeScript 中创建变量?...全局作用域:在任何类之外定义,可以程序中任何地方使用。 函数/类范围:函数或类中定义变量可以该范围内任何地方使用。...局部作用域/代码块:局部作用域中定义变量可以该块中任何地方使用。 23、TypeScript箭头/lambda 函数是什么? 胖箭头函数是用于定义匿名函数函数表达式速记语法。...26、Omit类型有什么作用? Omit是实用程序类型一种形式,它促进了常见类型转换。Omit允许你通过传递电流Type并选择Keys类型中省略来构造类型

    4.8K20

    30个小知识让你更清楚TypeScript

    TypeScript类型断言工作方式类似于其他语言中类型转换,但没有 C# 和 Java 等语言中可能类型检查或数据重组。类型断言对运行时没有影响,仅由编译器使用。...类型断言本质上是类型转换软版本,它建议编译器将变量视为某种类型,但如果它处于不同形式,则不会强制它进入该模型。 9、如何在 TypeScript 中创建变量?...全局作用域:在任何类之外定义,可以程序中任何地方使用。 函数/类范围:函数或类中定义变量可以该范围内任何地方使用。...局部作用域/代码块:局部作用域中定义变量可以该块中任何地方使用。 23、TypeScript箭头/lambda 函数是什么? 胖箭头函数是用于定义匿名函数函数表达式速记语法。...26、Omit类型有什么作用? Omit是实用程序类型一种形式,它促进了常见类型转换。Omit允许你通过传递电流Type并选择Keys类型中省略来构造类型

    3.6K20

    30道TypeScript 面试问题解析

    TypeScript类型断言工作方式类似于其他语言中类型转换,但没有 C# 和 Java 等语言中可能类型检查或数据重组。类型断言对运行时没有影响,仅由编译器使用。...类型断言本质上是类型转换软版本,它建议编译器将变量视为某种类型,但如果它处于不同形式,则不会强制它进入该模型。 9、如何在 TypeScript 中创建变量?...全局作用域:在任何类之外定义,可以程序中任何地方使用。 函数/类范围:函数或类中定义变量可以该范围内任何地方使用。...局部作用域/代码块:局部作用域中定义变量可以该块中任何地方使用。 23、TypeScript箭头/lambda 函数是什么? 胖箭头函数是用于定义匿名函数函数表达式速记语法。...26、Omit类型有什么作用? Omit是实用程序类型一种形式,它促进了常见类型转换。Omit允许你通过传递电流Type并选择Keys类型中省略来构造类型

    4.4K20

    分享 30 道 TypeScript 相关面的面试题

    它们允许函数和方法根据输入类型表现不同,而不会丢失类型信息。常见类型保护包括使用 typeof、instanceof 和用户定义类型保护函数。...公共属性(通常称为“鉴别器”)允许我们联合内类型之间安全地切换,从而更轻松地使用此类对象。 12、继承 TypeScript 中如何发挥作用?...14、 TypeScript 中,比较运算符 == 和 === 有什么不同?...另一方面, === 是一个严格相等运算符,它检查值和类型,使其类型敏感上下文中更安全、更可预测。 15、如何在 TypeScript 中声明只读数组,以及为什么要使用它?...18、命名空间 TypeScript 中起什么作用,它们仍然相关吗? 答案:TypeScript命名空间是一种对相关代码进行分组方法,它们有助于避免全局命名空间中命名冲突。

    77830

    1.8W字|了不起 TypeScript 入门教程(第二版)

    JavaScript 中是没有元组,元组是 TypeScript 中特有的类型,其工作方式类似于数组。 元组可用于定义具有有限数量未命名属性类型。每个属性都有一个关联类型。...: number; 确定赋值断言,TypeScript 编译器就会知道该属性会被明确地赋值。 四、类型守卫 类型保护是可执行运行时检查一种表达式,用于确保该类型一定范围内。...换句话说,类型保护可以保证一个字符串是一个字符串,尽管它值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。...这种类型本质是结合联合类型和字面量类型一种类型保护方法。如果一个类型是多个类型联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同类型保护区块。...为什么接口 X 和接口 Y 混入后,成员 c 类型会变成 never 呢?

    10.2K51

    组合类型类型保护_TypeScript笔记9

    ,见4.24 Type Guards P.S.另外,class具有双重类型含义,TypeScript代码里体现形式如下: 类类型:typeof className 类实例类型:typeof className.prototype...但这仅在TypeScript编译时成立,与JavaScript运行时概念有冲突: class A {} class B extends A {} // 构造函数prototype属性是类实例,其类型类实例类型...对此,TypeScript也提供了符合直觉类型保护: function createDate(value: string | undefined) { // 缩窄到string value =...相当于类型断言(不同类型保护): let x: string | undefined | null; x!....,断言是一次性(或者说是临时),而类型保护一定作用域下都有效 参考资料 Advanced Types

    1.6K20

    了不起 TypeScript 入门教程

    JavaScript 中是没有元组,元组是 TypeScript 中特有的类型,其工作方式类似于数组。 元组可用于定义具有有限数量未命名属性类型。每个属性都有一个关联类型。...通过类型断言这种方式可以告诉编译器,“相信我,我知道自己干什么”。类型断言好比其他语言里类型转换,但是不进行特殊数据检查和解构。它没有运行时影响,只是在编译阶段起作用。...官方文档 类型保护是可执行运行时检查一种表达式,用于确保该类型一定范围内。...换句话说,类型保护可以保证一个字符串是一个字符串,尽管它值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。...这种类型本质是结合联合类型和字面量类型一种类型保护方法。如果一个类型是多个类型联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同类型保护区块。

    7K52

    2023金九银十必看前端面试题!2w字精品!

    全局作用域中,this指向全局对象(浏览器环境中为window对象)。函数中,this指向取决于函数调用方式,可以通过call、apply、bind等方法来显式地指定this值。 9....TypeScript泛型是什么?如何使用泛型? 答案:泛型是一种用于创建可重用代码工具,它允许定义函数、类或接口时使用占位符类型。可以使用尖括号()来指定泛型类型。...TypeScript类型推断是什么?如何使用类型推断? 答案:类型推断是指TypeScript根据上下文自动推断变量类型,而无需显式地添加类型注解。...答案:插槽是一种用于组件中扩展内容机制。命名插槽允许组件向子组件插入具有特定名称内容,而作用域插槽允许子组件将数据传递给组件。示例: <!...主要用于组件位置移动,而主要用于组件显示和隐藏过渡。 13. Vue.js 3中v-for指令中key属性有什么作用为什么要使用它?

    45742

    TypeScript 常用知识总结

    TypeScript 引入了命名空间 TypeScript 优势 静态输入: 静态类型化是一种功能,可以开发人员编写脚本时检测错误。查找并修复错误是当今开发团队迫切需求。...三、TypeScript 组成 模块 函数 变量 语句和表达式 注释 四、tsc 常用编译参数 参数作用--help显示帮助信息--module载入扩展模块--target设置 ECMA 版本--declaration...元组中允许存储不同类型元素,元组可以作为参数传递给函数。...访问控制修饰符:TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法访问。TypeScript 支持 3 种不同访问权限。...protected : 受保护,可以被其自身以及其子类和类访问。 private : 私有,只能被其定义所在类访问。

    1.8K30

    初探TypeScript

    为什么TypeScript TypeScript定位是静态类型语言,而不是类型检查器;JavaScript作为一门解释型语言,动态数据类型变量中,很可能出现在编译过程中,因为数据类型问题而把时间耗费...debug过程中,大大降低了开发效率;TypeScript类型机制,能让开发者通过对类型监控程度控制,大大减少甚至杜绝由变量类型引起报错;这种开发手段,构建大型项目或多人协作项目上,都能起到很好正面作用...; TypeScript类 我们可以TypeScript中使用面向对象模式进行编程,允许使用继承(extends)来扩展现有的类; TypeScript成员都默认为public,被声明为private...成员不能被外部访问; TypeScript中,派生类中可通过实例方法访问protected成员,但无法使用; 构造函数能被标记为protected,这时候,这个类仅能在包含它内实例化,但仍能被继承...TypeScript里,接口作用就是为这些类型命名和为你代码或第三方代码定义契约。

    82720
    领券