概述: TS是JS的超集(TypeScript 是一种给 JavaScript 添加特性的语言扩展。),JS有的Ts都有,Ts是微软开发的开源编程语言,遵循Es6、Es5规范,设计目标是开发大型应用,可以在任何浏览器、计算机、操作系统上运行。本质上向JS中添加了可选的静态类型和基于类的面向对象编程。
区别: JS变量是没有类型的,即age=18,age可以是任何类型的,可以继续给age赋值为age=”aaa” Ts有明确的类型(即:变量名:number(数值类型)) eg:let age: number = 18
TS优势
类型化思维方式,使开发更严谨,提前发现错误,减少改Bug时间
类型系统提高了代码可读性,维护和重构代码更加容易
补充了接口、枚举等开发大型应用时JS缺失的功能
JS的类型系统存在"先天缺陷",绝大部分错误都是类型错误(Uncaught TypeError)
TypeScript的原始类型包括: boolean、number、string、void、undefined、null、symbol、bigint。
布尔类型:boolean
数字类型:number
字符串类型:string
空值:void
Null 和 Undefined:null 和 undefined
Symbol 类型:symbol
BigInt 大数整数类型:bigint
类型:
类型 | 例子 | 描述 |
---|---|---|
number | 1, -33, 2.5 | 任意数字 |
string | 'hi', "hi" | 任意字符串 |
boolean | true、false | 布尔值true或false |
字面量 | 其本身 | 限制变量的值就是该字面量的值 |
any | * | 任意类型 |
unknown | * | 类型安全的any |
void | 空值(undefined) | 没有值(或undefined) |
never | 没有值 | 不能是任何值 |
object | {name:"孙悟空"} | 任意的JS对象 |
array | [1, 2, 3] | 任意JS数组 |
tuple(元组) | [4, 5] | 元素,TS新增类型,固定长度数组 |
enum | enum(A, B) | 枚举, TS中新增类型 |
我们使用数组来存储相同类型的值,数组是有序和索引的值集合
索引从 0 开始,即第一个元素的索引为 0,第二个元素的索引为 1,依此类推
any类型
可以赋值任意类型的数据
声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
当一个变量需要赋值的数据类型不确定时,就使用any类型,它可以赋值任意数据类型
void 用来表示空, 以函数为例, 就表示没有返回值的函数或返回值为undefind
void返回值是空(undefind),但是不能将类型“null”分配给类型“void”。
因为没有返回值的函数总是返回 undefined,而 void 总是在 JavaScript 中返回 undefined,TypeScript 中的void 是一个正确的类型,告诉开发人员这个函数返回 undefined
type 只能声明一次
interface 可以声明多次
enum
let const var
函数是执行特定代码的代码块
函数可以有选择地接受一个或多个参数,处理它们,并有选择地返回一个值。
function greet(name: string): string { return `Hello,${name}` } let greeting = greet("string字符串")
对象是类似字典的keys和values的集合
,key 必须是唯一
的。它们类似于数组,有时也称为关联数组
但是,数组使用数字来索引值,而对象允许使用任何其他类型作为键
let obj: {x: number; y: string} = { x: 10, y: "hello" }
通过添加 ?
对象类型可以具有零个或多个可选属性,在属性名称之后
let obj: {x: number; y: string; z?: number} = { x: 10, y: "hello" } // z可以加可以不加
枚举允许我们创建命名常量,这是一种为数字常量值赋予更友好名称的简单方法
枚举由关键字 enum 定义,后跟其名称和成员
// 在js的标准中是没有枚举这一说的,但在typescript中是有这个类型的。枚举的意思是把所有相关的子数据,都收集起来。例如一个星期里的每一天: // 枚举允许开发者定义一组命名的常量。使用枚举可以使其更容易记录意图,或创建一组不同的情况。TypeScript提供了基于数字和字符串的枚举。 // 数字枚举 enum Weekday { Monday, Tuseday, Wednesday=6, // 默认从0开始,但到这里,从6开始 Thursday, Friday, Saturday, Sunday } // 然后直接通过Weekday.Monday就可以获取到对应的值,默认情况下,第一个枚举值是0,然后每个后续值依次递增 1。 // 数字枚举如果没有初始化,默认初始化值为0,每项+1 // 如果有初始化,则在初始化值的基础上,每项+1 // 如果某项被赋值(可以是负数或负数),那么之后的项在此基础上+1 // 如果未手动赋值的枚举项与手动赋值的重复了,如例4,TypeScript 是不会察觉到这一点的,但建议尽量避免 // 字符串枚举:声ming必须 enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", } // 很好地 "序列化"
TypeScript 提供了以下三种循环集合的方法
// for 循环 let values = [10,"foo",true]; for(let i = 0; i < values.length; i++){ console.log(values[i]) } // forEach函数 let values = [10,"foo",true]; values.forEach( val =>{ console.log(val) }) // for..of 声明 let values = [10,"foo",true]; for(let val of values) { console.log(val) }
类型别名为现有类型提供替代名称。如果类型名称太长,您可以引入不同的较短的名称,并使用新的名称
类型别名不会引入新类型,它们相当于相应的底层类型
接口基本使用
// 接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法 // 接口名可以重复(可以声明合并) interface yourType { name: string age: number } interface yourType { gender: string } const you: yourType = { name: 'yoyo', age: 333, gender: '女' // 这里的属性要和接口中一致,不能少,不能多 }
类型别名基本使用
// 描述一个对象的类型 // 类型别名:名称唯一,不能重复 type myType = { name: string age: number } const obj: myType = { name: 'ccc', age: 33 // 这里的属性要和类型声明中一致,不能少,不能多 }
区别:
命名规范
type类型别名 命名唯一,不可重复
interface接口 可以重复定义
type可以使用in 关键字生成映射类型 interface不行
type Keys = "firstname" | "surname" type DudeType = { [key in Keys]: string } const test: DudeType = { firstname: "Pawel", surname: "Grzybek" }
interface 与 type 可以相互扩展对方 单语法不通 (extends关键字 &操作符)
type PartialPointX = { x: number; }; interface Point extends PartialPointX { y: number; } // 利用type扩展interface const obj: Point = { x: 22, y: 33 } interface PartialPointX { x: number; } type Point = PartialPointX & { y: number; }; // 利用interface扩展 type const obj: Point = { x: 22, y: 33 } console.log(obj) // 输出: // { "x": 22, "y": 33 }
建议: 公共的用 interface 实现,不能用 interface 实现的再用 type 实现
ts中的泛型就跟any差不多,不过与any不同的是,any会丢失类型而泛型不会。
当应一个函数中传入一个 num 10 但是最后返回回来的参数可能是 string ,这样对于参数类型就会丢失。