首页
学习
活动
专区
圈层
工具
发布

TypeScript学习笔记(二)—— TypeScript基础

,未强调编译错误的代码片段,默认为编译通过 注意,使用构造函数 Boolean 创造的对象不是布尔值: let createdByNewBoolean: boolean = new Boolean(1)...{ return x + y; }; 这是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的。...总之,一方面不能滥用 as any,另一方面也不要完全否定它的作用,我们需要在类型的严格性和开发的便利性之间掌握平衡(这也是 TypeScript 的设计理念之一),才能发挥出 TypeScript 最大的价值...,这里我们使用了简化的父类子类的关系来表达类型的兼容性,而实际上 TypeScript 在判断类型的兼容性时,比这种情况复杂很多,详细请参考[类型的兼容性(TODO)][]章节。...9.4、双重断言 既然: 任何类型都可以被断言为 any any 可以被断言为任何类型 那么我们是不是可以使用双重断言 as any as Foo 来将任何一个类型断言为任何另一个类型呢?

5.9K20

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

image.png 上一篇更好的类型推断的文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性的字面量始化来推断字面量类型。...非扩展字面量类型 可以通过显式地将变量标注为字面量类型来创建非扩展字面量类型的变量 const stringLiteral: "https" = "https"; // 类型 "https" (非扩展)...使用TypeScript 2.1,TypeScript 不是仅仅选择any类型,而是基于你后面的赋值来推断类型。 仅当设置了--noImplicitAny编译参数时,才会启用此选项。...混合类的构造函数 (如果有) 必须有且仅有一个类型为any[]的变长参数, 并且必须使用展开运算符在super(...args)调用中将这些参数传递。 定义完成之后,来研究一些代码。...,该签名描述了可以构造通用类型T的对象的类型,并且其构造函数接受任意数量的任何类型的参数。

5.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    TypeScript系列:第五篇 - 断言&守卫(as、satisfies、is、as const)

    此时,可以使用类型断言,告诉编译器此处的值是什么类型。TypeScript 一旦发现存在类型断言,就不再进行类型推断,而是直接采用断言给出的类型。...来告诉 TypeScript 编译器, username 是 HTMLInputElement 类型的一个实例;从而可以访问 HTMLInputElement 上特有的属性 value。...rest 参数 上面示例中,变量 num 的类型推断为 number[],导致使用扩展运算符...传入函数add()会报错,因为add()只能接受两个参数,而 ...num 并不能保证参数的个数。...Enum 类型;使用了as const断言以后,变量e2的类型被推断为 Enum 的某个成员,这意味着它不能变更为其他成员。...非空断言 对于那些可能为空的变量(即可能等于undefined或null),TypeScript 提供了非空断言,保证这些变量不会为空,写法是在变量名后面加上感叹号!。 x!.

    56400

    【TypeScript 演化史 — 第七章】映射类型和更好的字面量类型推断

    转换后的属性组成新的类型。 使用映射类型,可以捕获类型系统中类似 Object.freeze() 等方法的效果。冻结对象后,就不能再添加、更改或删除其中的属性。...这就是为什么当试图将 42 赋值给 x 属性时,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...请注意,以下只是出于解释目的,并不能准确反映TypeScript使用的解析算法。...可以使用Pick对该行为进行构建,正如其名称所示。 更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。...} 只读类属性只能立即初始化,也可以在构造函数中初始化。

    4.6K40

    TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型

    例如:let str: string = "Hello";布尔类型布尔类型用于表示逻辑值,即 true 或 false。可以使用 boolean 关键字来声明布尔变量。...null 类型用于表示空值或者对象引用为空。可以使用 void 和 null 关键字来声明对应的变量。...例如:let nothing: null = null; // 空值类型let nul: null = null; // 空值类型对象类型对象类型用于表示非原始数据类型,包括对象、数组、函数等。...可以使用 (参数类型) => 返回值类型 的语法来声明函数类型。...类型推断和类型断言TypeScript 具有强大的类型推断能力,它可以根据上下文自动推断变量的类型。例如,如果我们在定义变量时直接赋值,TypeScript 可以推断出变量的类型。

    3.6K30

    10个写TypeScript代码的坏习惯

    随意使用 any 类型 这种习惯看起来是什么样的 当你不确定结构时,可以用 any 类型。...从 JavaScript 转到 TypeScript 时,现有的代码库通常会对 TypeScript 编译器无法自动推断出的类型进行假设。...它还需要对正在构建的产品有更深入的了解,并且如果对产品的设计有所修改,可能会限制代码的使用。 为什么不该这样做 类型系统的最大好处是可以用编译时检查代替运行时检查。...对非布尔类型的值进行布尔检查 这种习惯看起来是什么样的 通过直接将值传给 if 语句来检查是否定义了值。...在对“非布尔类型的值”进行布尔检查时 countOfNewMessages 为 0 的问题在使用 !! 时仍然会存在。 10. != null 这种习惯看起来是什么样的 棒棒运算符的小弟 !

    94220

    【TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

    转换后的属性组成新的类型。 使用映射类型,可以捕获类型系统中类似 Object.freeze() 等方法的效果。冻结对象后,就不能再添加、更改或删除其中的属性。...这就是为什么当试图将 42 赋值给 x 属性时,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...请注意,以下只是出于解释目的,并不能准确反映TypeScript使用的解析算法。...可以使用 Pick 对该行为进行构建,正如其名称所示。 更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。...} 只读类属性只能立即初始化,也可以在构造函数中初始化。

    3.7K10

    理解 TypeScript 类型拓宽

    从表达式推断变量、属性或函数结果的类型时,源类型的拓宽形式用作目标的推断类型。类型的拓宽是所有出现的空类型和未定义类型都被类型 any 替换。 以下示例显示了拓宽类型以产生推断的变量类型的结果。...换句话说,它需要根据你指定的单个值来确定一组可能的值。在 TypeScript 中,此过程称为拓宽。理解它可以帮助你理解错误并更有效地使用类型注释。...通过 TypeScript 的错误提示消息,我们知道是因为变量 x 的类型被推断为 string 类型,而 getComponent 函数期望它的第二个参数有一个更具体的类型。...(vec, x); // OK 因为 x 不能重新赋值,所以 TypeScript 可以推断更窄的类型,就不会在后续赋值中出现错误。...它需要推断一个足够具体的类型来捕获错误,但又不能推断出错误的类型。它通过属性的初始化值来推断属性的类型,当然有几种方法可以覆盖 TypeScript 的默认行为。

    2K40

    【万字长文】TypeScript入门指南

    当一个函数没有返回值时,你通常会见到其返回值类型是 voidfunction fnvoid():void{ return//函数也可以定义为空值,如果定义了void则不能返回内容}//undefined...console.log(a)//输出{name:'叶秋学长',age:18}函数重载重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。...那为什么不使用any呢?...,而非静态的需要在创建对象才存在静态属性是整个类都公用的生命周期不一样,静态在类消失后被销毁,非静态在对象销毁后销毁用法:静态的可以直接通过类名访问,非静态只能通过对象进行访问使用static注意事项带静态修饰符的方法只能访问静态属性非静态方法既能访问静态属性也能访问非静态属性非静态方法不能定义静态变量静态方法不能使用...注:不是优先于构造函数执行,而是依托于构造函数,如果不创建对象就不会执行构造代码块普通代码块和构造代码块的区别在于,构造代码块是在类中定于的,而普通代码块是在方法体中定义的,执行顺序和书写顺序一致。

    1.6K42

    要改掉的 10 种 TypeScript 坏习惯

    运算符是去年才引入的,所以在长函数中间使用值时,可能很难习惯将其设置为参数默认值。 为什么应该纠正它 与||不同,?? 仅对 null 或 undefined 回退,而不对所有虚假值回退。...另外,如果你的函数太长而无法在开始时定义默认值,那么将它们拆分可能是个好主意。 3. 使用 any 类型 具体是什么意思 当你不确定结构时,将 any 用于数据。...从 JavaScript 转换为 TypeScript 时,现有的代码库通常会对 TypeScript 编译器无法自动推断出的类型进行假设。...它还需要对正在构建的产品有更深入的了解,并且如果对产品的假设发生更改,可能会限制代码的使用。 为什么应该纠正它 类型系统的最大好处是它们可以用编译时检查代替运行时检查。...非布尔布尔检查 具体是什么意思 将一个值直接传递给 if 语句来检查是否定义了这个值。 function createNewMessagesResponse (countOfNewMessages?

    77820

    【TS 演化史 -- 17】各文件的JSX工厂 、有条件类型和映射类型修饰符

    有条件类型 TypeScript 2.8 引入了有条件类型,这是类型系统的强大而令人兴奋的补充。 有条件类型使咱们可以表达非均匀类型映射,即,根据条件而不同的类型转换。...有条件类型中的类型推断 有条件类型支持的另一个有用特性是使用新的infer关键字推断类型变量。...在有条件类型的extends子句中,可以使用新的infer关键字来推断类型变量,从而有效地执行类型上的模式匹配 type First = T extends [infer U, ...unknown...它使用infer关键字来推断函数类型的返回类型: type ReturnType = T extends (...args: any[]) => infer R ?...InstanceType InstanceType类型提取构造函数类型的返回类型,它相当于构造函数的ReturnType。

    3.1K20

    TypeScript入门秘籍:快速掌握静态类型编程

    一、为什么选择TypeScript?类型安全:TypeScript在编译时进行类型检查,可以提前发现潜在的错误。...boolean:表示布尔值,即true或false。any:表示任意类型,可以赋值为任何值。unknown:表示未知类型,不能直接赋值给其他变量,除非进行类型断言或类型检查。...void:表示没有返回值的函数。never:表示永远不会发生的值,通常用于抛出异常或无限循环的函数。object:表示非原始类型的值,如对象、数组等。...TypeScript具有强大的类型推断能力,很多时候你不需要显式地指定类型,TypeScript会自动推断出正确的类型。...九、总结通过这篇博客,你已经学会了如何安装和使用TypeScript,了解了TypeScript的基本类型、接口和类,以及类型推断。

    60221

    TypeScript 官方手册翻译计划【二】:普通类型

    ,因为 TypeScript 会基于 return 语句推断出函数返回值的类型。...当一个函数出现在某个地方,且 TypeScript 可以推断它是如何被调用的时候,该函数的参数会被自动分配类型。...}); 即使这里没有给参数 s 添加类型注解,TypeScript 也可以基于 forEach 函数的类型,以及对于 name 数组类型的推断,来决定 s 的类型。...接口的所有特性几乎都可以在类型别名中使用。两者关键的区别在于类型别名无法再次“打开”并添加新的属性,而接口总是可以拓展的。...toFixed()); } 和其它的类型断言一样,非空值断言也不会改变代码的运行时行为,所以切记:仅在你确定某个值不可能为 null 或者 undefined 的时候,才去使用 !。

    2.8K20

    什么是鸭子🦆类型?

    为什么需要鸭子类型 在一些动态语言中,鸭子类型的常见用法就是假设给定值符合我们预期的,你可以先尝试执行一个操作,然后我们再去处理不符合预期的情况下的异常。...is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值的函数,可以用来做类型保护; 类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内...用法示例 recursiveResolve 鸭子类型的一个方便用法是当你的代码可能接受 Promise 或者 非Promise 时来帮我们进行更优雅的判断。...然后我们就可以在 recursiveResolve 函数中使用它们了,并且开销是很小的,在整个函数中都能正确推断输入。...小技巧 - 通用类型保护 上面的判断可能在我们的代码中是个很常见的用法,如果我们需要判断的类型有很多,为每个类型都实现一个这样的类型保护函数还挺麻烦的,所以我们可以稍微做个变形来封装一个更通用的类型保护函数

    2.9K20

    TS 进阶 - 类型基础

    ReadonlyArray 而不是 Array # type 与 interface 虽然 type 也可以代替 interface 描述对象,但更推荐用 interface 来描述对象、类的结构,而类型别名用来将一个函数签名...(对应字符串字面量类型那种) 可以使用 {} 作为类型签名,一个内部无属性定义的空对象,类似于 Object,接受任何非 null 和 undefined 的值 const tmp1: {} = undefined...此时,可以使用私有构造函数来组织其被错误的实例化,如在创建 Utils 类时,其内部都是静态成员。...,而不是通过 new 实现,可以使用私有构造函数。...非空断言是类型断言的简化,标记前面的一个声明一定是非空的,即剔除 null 和 undefined 类型: declare const foo: { func?

    2.7K50

    TypeScript 官方手册翻译计划【三】:类型收缩

    可以理解几种不同的用于收缩类型的构造。...(后者的优势在于,TypeScript 可以将其推断为一个更具体的字面量布尔值类型 true,而前者只能被推断为 boolean) // 下面的结果都是 true Boolean("hello"); /...我们这里刚好遇到了一个场景,那就是我们掌握的关于这个值的信息比类型检查器要多。因此,这里可以使用一个非空值断言(给 shape.radius 添加后缀 !)表明 radius 一定是存在的。...我们不得不给类型检查器添加大量的非空值断言(!),让它确信 shape.radius 已经被定义好了,但如果把代码移除,这些断言就很容易造成错误。...同理,这种检查也可以用于 switch 语句中。现在我们可以编写一个完整的 getArea 函数了,而且它没有任何麻烦的 ! 非空值断言符号。

    2.4K20
    领券