前言 我们前几篇内容搭建和TS的学习环境,大家可以根据自己的需求进行配置,从今天开始我们正式学习TS相关的语法内容。我们这次先简单的介绍一些在TS中常见的数据类型。...我们在TS中可以通过如下的形式来指定一个变量的类型为 字符串: const name_str: string = "Tango"; 当我们给一个变量指定了数据类型后,如果尝试给他赋值一个不是该类型的变量值时...来声明,然后数据类型是通过中括号来声明,并且没有使用或而是用的逗号来分隔。...枚举类型 在TS中我们可以通过如下的方式来定义一个枚举类型的数据 enum UserData { "Tango", "Nexus", "Tom", "Jeck", } 当它被编译为js时会变成如下的结构...,那么可以将其数据类型设置为any类型的。
先说一下条件类型是什么条件类型是一种由条件表达式所决定的类型。条件类型使类型具有了不唯一性,同样增加了语言的灵活性。总言之,条件类型就是在类型中添加条件分支,以支持更加灵活的泛型,满足更多的使用场景。...X : Y表示若类型T可被赋值给类型U,那么结果类型就是X类型,否则就是Y类型。而内置条件类型则是TS内部封装好的一些类型处理,使用起来更加便利。...内置条件类型:ReturnType\在 2.8 版本中,TypeScript 内置了一些与 infer 有关的映射类型,就比如说我们今天的主角:ReturnType其用于提取函数的返回值类型...其他内置的条件类型还有:Exclude -- 从T中剔除可以赋值给U的类型。Extract -- 提取T中可以赋值给U的类型。...讲回inferinfer 最早出现在此 PR 中,表示在 extends 条件语句中待推断的类型变量。
# vuex 使用 Ts推断类型 在使用 vue3 开发项目过程中会使用到状态管理,在 vue3 中官方推荐使用 pinia 作为状态管理工具,pinia 很好的支持了 ts 所以直接安装就可以使用,但是...vuex 要使用 ts 进行类型推断的话就需要进行一些配置 # 1.项目安装 vuex @4.0 # 2.配置 vuex 1.在 src 文件夹下面常见 store 文件夹 2.创建 store 入口文件...state: () => {}, mutations: {}, actions: {}, getters: {}, modules: {} }) 3.在 main.ts...进行类型推断了 1.先按照官方的配置方法配置一个 # 4.以上是官方的配置方法 但是官方的配置方法并没有如何配置模块的示例代码,接下来怪兽给大家配置一个模块化的示例代码 先创建一个 vuex 的模块,...模块具体创建方法:vuex模块化创建步骤open in new window store.ts
文档: https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types 让我们用中文来解释这两个例子的区别...交集类型 type Bar = { x: number }; type Baz = { y: number }; type Foo = Bar & Baz; 结果 Foo 类型: { x: number...; y: number } 解释: Foo 是 Bar 和 Baz 的交集类型。...`Foo` 或 `Baz` 之一 总的来说 交集类型(&):要求所有类型的属性都存在。...联合类型(|):允许类型是其中之一。
前言由于现在工作使用的技术栈是 React、TypeScript 和 ahooks,工作中需要用到大量的类型定义,特此记录一下一些常用的 类型通用API 封装。...T 类型中的 null 及 undefined 类型Parameters:获取函数的参数类型,将每个参数类型放在一个元组中Omit:从类型 T 中剔除 K 中的所有属性Pick:从类型 T 中挑选 K 中的所有属性Exclude:提取存在于 T,但不存在于 U 的类型组成的联合类型Extract:提取联合类型 T 和联合类型 U 的所有交集Record...:构造一个具有一组属性 K (类型 T )的类型TS 内置关键字extends:继承、泛型约束、条件类型infer:这玩意我到现在都还没搞懂keyof:将一个类型的属性名全部提取出来当做联合类型...typeof:在类型上下文中获取变量或者属性的类型in:常用来遍历枚举类型TS compiler 内部实现的类型Uppercase:构造一个将字符串转大写的类型Lowercase:构造一个将字符串转小写的类型
前言 前面我们介绍了TS中的类型: 在TS中,与JS相对应数据类型 与JS相比,TS多了哪些类型 今天我们来搞清楚在TS中的两个概念:类型断言与类型守卫 例子 先来看个例子 type User = {...user.name); console.log(user.age); } showUser({ name: 'Alice', age: 12 }) 复制代码 如上,showUser函数执行传递的参数是符合类型要求的...我们知道语言在运行时是不具有类型的,那我们在运行时如何保证和检测来自其他地方的数据也符合我们的要求呢?...这就类型断言要干的事 类型断言 所谓断言就是断定、确定、绝对的意思;所以简单来讲,类型断言就是保证数据类型一定是所要求的类型 类型守卫 类型断言还需要借助类型守卫函数,类型守卫函数就是用于判断未知数据是不是所需类型...,唯一需要注意其返回值类型比较特殊特殊,格式:x is y ,表示x是不是y类型 if (isUser(errorType)) { showUser(errorType); } 复制代码 经过这样的类型断言后就不会报错了
前言在我们使用 TypeScript 开发业务的时候,也许你会遇到一个这样的问题:我们如何根据一个数组的值得到一个联合类型?...这里向大家介绍一个开发小技巧:使用元组生成联合类型开发场景我们看下面一段 ts 代码:const colors = ['red','green','orange','blue']; // 这里 ts 解析的是...string[]// 这里的 value 类型该如何标注,使它的值只能是 colors 中的值const setColors = (value:?)...将元组类型转成联合类型type Colors = typeof colors[number];// 这里的 value 类型该如何标注,使它的值只能是 colors 中的值const setColors...= (value:Colors) => { console.log('value',value)};这样我们就可以完成 ts 的类型检查了:
TypeScript 给 JavaScript 加了套静态类型系统。其中,JavaScript 中的数组、对象等聚合多个元素的类型在 TypeScript 中对应的是索引类型。...它是 TS 内置的高级类型。 在构造新的索引类型的过程中,还可以做加上一些修饰符。...: 映射类型可以生成新的索引类型,在生成过程中可以加上或去掉 readonly、?...总结 TypeScript 通过索引类型来表示有多个元素的聚合类型,比如数组、对象等。 TS 支持类型编程,也就是对类型参数做各种运算然后返回新的类型。...对索引类型当然也可以做运算,对应的类型就是映射类型。 映射类型在生成新的索引类型的过程中,还可以加上或去掉 readonly、?的修饰符。
TypeScript 中通常用于描述对象的形状,即该对象应该有哪些属性,以及这些属性的类型是什么。...在 TypeScript 中,可以使用 in 关键字来定义映射类型,其中映射类型不能直接在interface使用// 定义一个字符串字面量类型的联合type Keys = 'username' | 'sex...' | 'age';// 该对象类型的属性名是T中的每一个值,属性值是string类型type KeyedStrings = { [P in T]: string;...interface中使用的,因为映射类型是通过type关键字定义的,而不是interface。...但是,你可以在一个interface中使用映射类型作为属性的类型。
本文会和大家详细介绍 TypeScript 中的映射类型(Mapped Type),看完本文你将学到以下知识点: 数学中的映射和 TS 中的映射类型的关系; TS 中映射类型的应用; TS 中映射类型修饰符的应用...在我们实际开发中,经常会需要一个类型的所有属性转换为可选类型,这时候你可以直接使用 TypeScript 中的 Partial工具类型: type User = { name: string;...关于类型体操的练习,有兴趣可以看看这篇文章: 《这 30 道 TS 练习题,你能答对几道?》.... */ 四、映射修饰符的应用 在自定义映射类型的时候,我们可以使用两个映射类型的修饰符来实现我们的需求: readonly修饰符:将指定属性设置为只读类型; ?...修饰符:将指定属性设置为可选类型; 前面介绍 Readonly和 Partial工具类型的时候已经使用到: type Readonly = { readonly [P in keyof T]:
TS中type和interface在类型声明时的区别在TS中interface 和 type都可以用来自定义数据类型,两者有许多相同之处,但是也有差别。...所以在需要定义一个可以被类实现的类型时,应该使用 interface 进行定义。...因为 interface 允许你使用逗号分隔的方式来继承多个接口,而 type 只能使用交叉类型(&)来实现继承。...如果使用 type 来定义 Manager类型,那么就需要使用交叉类型来实现继承,但是这么实现起来就比较复杂。总的来说,interface 和 type 都有自己的优势和使用场景。...如果使用 type 来定义 User 类型,那么就无法实现声明合并的功能,代码会直接报错。
一、联合类型 在 TypeScript 中,一个变量不会被限制为单一的类型。如果你希望一个变量的值,可以有多种类型,那么就可以使用 TypeScript 提供的联合类型。...: number; } interface Dog { isAGoodBoy: boolean; } let animal: Cat | Dog; 当我们使用联合类型时,我们必须尽量把当前值的类型收窄为当前值的实际类型...在 isCar 函数的方法体中,我们不仅要检查 vehicle 变量是否含有 turnSteeringWheel 属性,而且还要告诉 TS 编译器,如果上述逻辑语句的返回结果是 true,那么当前判断的...== undefined; } 在以上代码中,我们定义了一个通用的类型保护函数,你可以在需要的时候使用它来缩窄类型。...而且在实际的开发过程中,只要我们合理的使用类型保护函数,就可以让我们的代码在运行时能够保证类型安全。
前言 我们上一篇内容简单的介绍了判断语句以及循环语句,今天我们一起来学习一下TS中的函数,除此之外我还会再介绍两个和函数相关的配置。...我们在函数内部实现了根据运算符的不同,对输入的两个数据进行不同的计算,并将它的结果返回。 因此我们可以看到函数的返回值类型被我们指定为了number。 定义好了函数,该如何使用呢?...它除了写法不同之外和普通的函数在使用上没有什么太大的差别。...const my_result = calculator(2, 2, "*"); console.log(my_result); =>箭头符号在函数中的使用 匿名函数我们省略了函数名,我们甚至还可以省略...总结 今天我们一起学习了如何在TS中编写函数,并修改了一下编译配置文件。希望对你能有所帮助。 今天的内容就是这些了,我是Tango,一个热爱分享技术的程序猿我们下期见。
那如果你构建出了 umd 规范的代码,使用者用 script 的方式给引入了: 这样还能做类型提示和检查么?...ts import 语法的,支持 umd 得加上这一行,然后加上 export as namespace Guang; 这样你在非 esm 里就可以通过全局类型的方式使用它了: 而在 esm 里,如果也是这样用的...有个 allowUmdGlobalAccess 的编译选项就是控制是否支持在 es module 里使用 UMD 全局类型的: 默认是 false,开启以后在 es module 里使用 UMD 全局类型就不报错了...用这种方式声明的类型,当在非 esm 中使用时,会作为全局类型,而在 esm 中如果直接引用全局类型会报错,建议用 import 引入。这是它比 declare global 更好的地方。...当然,也可以把 allowUmdGlobalAccess 的编译选项设置为 true 来放开这种约束。
一、使用 object 类型进行类型声明 随着 TypeScript 2.2 的发布,标准库的类型声明已经更新,以使用新的对象类型。...使用这种类型,我们不能访问值的任何属性。...的原型链隐式地使用: // Type {} const obj = {}; // "[object Object]" obj.toString(); 在 JavaScript 中创建一个表示二维坐标点的对象很简单...支持在 .ts 文件中通过在报错一行上方使用 // @ts-ignore 来忽略错误。...// @ts-ignore 注释会忽略下一行中产生的所有错误。建议实践中在 @ts-ignore之后添加相关提示,解释忽略了什么错误。 请注意,这个注释仅会隐藏报错,并且我们建议你少使用这一注释。
TS中并不能判断在使用联合类型时具体是那种类型?当我们不知道是什么类型的情况下要使用某个类型特有的属性或者方法,那么就可以用断言来实现,它实际上是对编辑器做了提前告知的行为,但是并不能保证运行中报错。...主要有两种方式来实现,具体如下:断言形式(1)尖括号形式语法:+value,尖括号中填写具体的类型。...;let length:number = (anyValue).length;//0使用断言虽然能避免编译中的报错,但是却避免不了运行中的报错type ClaaM = number |...但是编译成JS后,运行过程中就报错了,所以除非确切的知道变量的数据类型,否则不要使用类型断言,这是因为类型断言会让 TypeScript 编译器将变量当做指定的类型,而不管它实际的类型,在程序运行时可能有类型错误...号,从而告诉 TS该属性会被明确地赋值。 错误示范,我们在对变量赋值之前就使用变量,就会报错。
创建了一个 “重学TypeScript” 的微信群,想加群的小伙伴,加我微信 “semlinker”,备注重学TS。 本文是 ”重学TS“ 系列,第 28 篇文章,感谢您的阅读!...联合类型在 TypeScript 中相当流行,你可能已经用过很多次了。交叉类型稍微不那么常见。它们似乎引起更多的困惑。 你有没有想过这些名字是怎么来的?...虽然你可能对两种类型的并集有一些直观感受,但交集通常不太容易理解。 阅读本文之后,你将对这些类型有更好的了解,这将使你在代码中使用它们时更有信心。...一、简单的联合类型 联合类型通常与 null 或 undefined 一起使用: const sayHello = (name: string | undefined) => { /* ... */ }...在 React 中,当你声明一个类组件时,可以使用它的属性类型对其进行参数化: class Counter extends Component { /* ... */ } 在类中
泛型Generics 是TS中的一个重要部分,这篇文章就来简单介绍一下其概念并在React中的应用。 1. 泛型Generics 是个啥?...这就需要泛型来处理这种情况:「它可以让你指定一个可以根据使用情况而改变的类型」。 但对于我们的User例子来说,使用一个「泛型」看起来是这样的。...上面的例子中,我们使用了来定义泛型。我们也可以使用函数来定义泛型。...在正常的 TypeScript 中,不需要使用这种变通方法。 ---- 泛型示例:useState 先让我们来看看 useState 的函数类型定义。...在React中使用泛型 现在我们已经理解了泛型的概念,我们可以看看如何在React代码中应用它。
TS系列地址: 21篇文章带你玩转ts # 函数的类型 函数是 JavaScript 中的一等公民 函数声明§ 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function...在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。...用接口定义函数的形状§ 我们也可以使用接口的方式来定义一个函数需要符合的形状: interface SearchFunc { (source: string, subString: string...剩余参数§ ES6 中,可以使用 ...rest 的方式获取函数中的剩余参数(rest 参数): function push(array, ...items) { items.forEach(function...这时,我们可以使用重载定义多个 reverse 的函数类型: function reverse(x: number): number; function reverse(x: string): string
TS系列地址: 21篇文章带你玩转ts # 数组的类型 在 TypeScript 中,数组类型有多种定义方式,比较灵活。...「类型 + 方括号」表示法§ 最简单的方法是使用「类型 + 方括号」来表示数组: let fibonacci: number[] = [1, 1, 2, 3, 5]; 数组的项中不允许出现其他的类型:...上例中,push 方法只允许传入 number 类型的参数,但是却传了一个 "8" 类型的参数,所以报错了。这里 "8" 是一个字符串字面量类型,会在后续章节中详细介绍。...= arguments; } 其中 IArguments 是 TypeScript 中定义好了的类型,它实际上就是: interface IArguments { [index: number...any 在数组中的应用§ 一个比较常见的做法是,用 any 表示数组中允许出现任意类型: let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com
领取专属 10元无门槛券
手把手带您无忧上云