网站建设定制开发ts基本类型 typeof 和keyof

安装编译ts的工具

  • 安装命令:npm i -g typescript 或者 yarn global add typescript

  • 网站建设定制开发验证是否安装成功:tsc –v(查看 的版本)。

编译并运行 TS 代码

  1. 创建 hello.ts 文件(注意:TS 网站建设定制开发文件的后缀名为 .ts)。

  2. 将 TS 编译为 JS:网站建设定制开发网站建设定制开发在终端中输入命令,tsc hello.ts(此时,网站建设定制开发在同级目录中会出现一个同名的 JS 文件)。

  3. 执行 JS 代码:在终端中输入命令,node hello.js

  4. 说明:网站建设定制开发所有合法的 JS 代码都是 TS 代码,有 JS 网站建设定制开发基础只需要学习 TS 网站建设定制开发的类型即可。

  5. 注意:由 TS 网站建设定制开发编译生成的 JS 文件,网站建设定制开发代码中就没有类型信息了。

 创建 .TS文件hello 通过 tsc hello.ts 命令会生成同名js文件 通过node hello.js运行js文件

TS基础 TypeScript

类型注解

给变量添加明确的类型约束叫做类型注解

  1. let name:string='张三'
  2. let age:number=18
  3. :number 和 :string 就是类型注解

TS常用基础类型细分为两类 分别是JS已有类型和TS新增类型 

 js已有类型  number ,string boolean null undefined  symbol 和 bigint 

Javascript自后一共有 7 种原始类型 和 1 种 引用类型,如下:
原始类型 number、 string 、 、 undefined 、 null 、 symbol 、 bigint
引用类型 object

TS新增类型有

a,联合类型 ,自定义类型(类型别名type..), 接口 元组 字面量类型 枚举 void ang等

b,注意:TS 中的原始类型和 JS 中写法一致;TS 中的对象类型在 JS 类型基础上更加细化,每个具体的对象(比如数组、对象、函数)都有自己的类型语法。

数组类型   []

arr是数组类型,数组里面装的是

  1. const arr=[1,2,3]
  2. // 定义
  3. const arr:number[]=[1,2,3]
  4. arr.push(8)

联合类型  |

一个 类型里面有多种类型 

const temp :number| string =8

记得优先级问题要加() 

  1. const arr:number| string[]=[1,'1'] // 不行报错 优先级问题
  2. // arr是 number类型或者string组成的数组类型
  3. 解决如下
  4. const arr:(number| string)[]=[1,'1']

 如果打印 结果   ts文件报错可以加 export{}来解决

泛型定义方式

  1. const arr:Array<number>=[1,2,3]
  2. const aee:Array<number|string>=[1,'1']

 联合类型的应用场景

错误写法

  1. let timer =null
  2. timer =setInterval(()=>{},2000)

正确写法一

  1. let timer = number= -1
  2. timer=setInterval(()=>{},2000)

正确写法二

  1. let timer= null |number =null
  2. timer=setInterval(()=>{})

类型别名

所谓的类型别名就是把类型给定义了一个名字       当类型很多或者很复杂或者重复使用时 这样书写就会便捷很多   名字可以用中文但是不建议 

  1. let arr1: (number | string)[] = [1, 'a', 3, 'b']
  2. let arr2: (number | string)[] = ['x', 'y', 6, 7]
  3. 改为
  4. type CustomArray = (number | string)[]
  5. let arr1: CustomArray = [1, 'a', 3, 'b']
  6. let arr2: CustomArray = ['x', 'y', 6, 7]
  • 解释说明。

    a,使用 type 关键字来创建自定义类型。

    b,类型别名(比如,此处的 CustomArray)可以是任意合法的变量名称。

    c,推荐使用大写字母开头。

    d,创建类型别名后,直接使用该类型别名作为变量的类型注解即可。

函数类型 

单独指定参数,返回值的类型

同时指定类型,返回值的类型

  1. // 解释:可以通过类似箭头函数形式的语法来为函数添加类型,注意这种形式只适用于函数表达式。
  2. type AddFn = (num1: number, num2: number) => number
  3. const add: AddFn = (num1, num2) => {
  4. return num1 + num2
  5. }

void类型

如果函数没有指定返回类型 默认为void

  1. function greet(name: string): void {
  2. console.log('Hello', name)
  3. // return undefined // 默认有这么一句
  4. }

如果 明确标记了函数的返回类型为undefined  那么就必须手动 return一个undefined

  1. const add = (): undefined => {
  2. return undefined
  3. }

可选参数 ?

  1. function mySplice(test:number , start?: number,end?:number){
  2. mySplice(1)
  3. mySplice()
  4. mySplice(1,2)
  5. 可选参数不能出现在必选参数前面 必须在必选函数后面 一般配合类型注解使用
  6. }

参数默认值=    

 对象类型 :object

const obj:object = {}

左边的{}表示 类型 (严格来说应该是对象字面量类型) ,右边的{}表示值

等号右边的值直接是一个对象时 左右两边数量保持一致 

  1. const person:{name:string;age:number} ={
  2. name:"zhansan",
  3. age:18
  4. }

如果提取了变量  值的实现是可以比类型多 (满足类型定义的条件下 类型定义准确)

 interface

interface +接口名用来描述对象类型

与extends使用具有继承性

相同点 

type 和interface的区别

    都可以用来描述对象 或者函数  都允许进行拓展 ,语法不同

不同点

1.   interface的接口拓展通过extends   type的接口拓展通过&

 2.  type 加=  interface不加=

3.type可以描述任意类型  interface只能用来描述对象或函数

4.相同的interface声明能够合并  相同的type声明会报错  (命名名字)

总结  :一般使用 interface来表述对象结构 用type 来描述类型关系

元组类型 

元组类型可以确切地标记出有多少个元素,以及每个元素的类型

// 可以给元组中的元素起别名

 类型推论

字面量类型

  1. let str1 = 'Hello TS' //string类型
  2. const str2 = 'Hello TS' // 字符串字面量类型

使用方式和场景

  • 使用方式:字面量类型常配合联合类型一起使用

  • 使用场景:用来表示一组明确的可选值列表,比如在贪吃蛇游戏中,游戏方向的值只能是上、下、左、右中的一个

  1. type Direction = 'up' | 'down' | 'left' | 'right'
  2. function changeDirection(direction: Direction) {
  3. console.log(direction)
  4. }
  5. changeDirection('up') // 调用函数时,会有类型提示

枚举类型

基本使用

  • 枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值。

  • 枚举:定义一组命名常量,它描述一个值,该值可以是这些命名常量中的一个。既可以当做值也可以当做类型

  • 使用 enum 关键字定义枚举,约定枚举名称以大写字母开头。

  • 枚举中的多个值之间通过 ,(逗号)分隔,定义好枚举后,直接使用枚举名称作为类型注解。

  1. // 创建枚举
  2. enum Direction {
  3. Up,
  4. Down,
  5. Left,
  6. Right,
  7. }
  8. // 可以当做类型使用枚举
  9. function changeDirection(direction: Direction) {
  10. console.log(direction)
  11. }
  12. // 也可以当做值使用枚举
  13. // 调用函数时,需要传入:枚举 Direction 成员的任意一个,类似于 JS 中的对象,直接通过点(.)语法 访问枚举的成员
  14. changeDirection(Direction.Up)

 数字枚举

  1. enum Direction {
  2. Up = 2,
  3. Down = 4,
  4. Left = 8,
  5. Right = 16,
  6. }
  7. console.log(Direction['Up']) // 2
  8. // 也可以反向操作
  9. console.log(Direction[2]) // Up

实现原理

  • 枚举类型比较特殊,不仅仅可以用作类型,还可以当做值使用,因为枚举成员都是有值的。

  • 也就是说,其他的类型会在编译为 JS 代码时自动移除,但是,枚举类型会被编译为 JS 代码

  • 说明:枚举与前面讲到的字面量类型 + 联合类型组合的功能类似,都用来表示一组明确的可选值列表。

  • 推荐:字面量类型 + 联合类型组合的方式,因为相比枚举,这种方式更加直观、简洁、高效。

字符串枚举

  • 定义:枚举成员的值是字符串称为字符串枚举。

  • 注意:字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值

  1. enum Gender {
  2. 女,
  3. 男,
  4. }
  5. type User = {
  6. name: string
  7. age: number
  8. // gender: '男' | '女' // 但后台需要 0 和 1
  9. gender: Gender
  10. }
  11. const user: User = {
  12. name: 'ifer',
  13. age: 18,
  14. gender: Gender.男,
  15. }

类型断言  as 或者 <>泛型

可以将一个宽泛的类型断言为更为简洁的类型

当你明确知道 你所写的类型是什么时  就可以使用 类型断言 为了使用 具体的方法

typeof 

js中判断某个数据的类型

  1. let a = 8
  2. console.log(typeof a)// 'number'

ts中的typeof是 根据已有的值 来获取值的类型  来简化代码的书写

 keyof

作用:获取接口、对象(配合 typeof)、类等的所有属性名组成的联合类型。

  1. // 接口
  2. interface Person {
  3. name: string
  4. age: number
  5. }
  6. type K1 = keyof Person // "name" | "age"
  7. type K2 = keyof Person[] // "length" | "toString" | "pop" | "push" | "concat" | "join"
  8. // 错误写法
  9. const a =keyof Person

要想获取对象的key组成的联合类型

1.先获取到对象的类型 通过typeof  2.获取对象类型所组成的联合类型

  1. const a ={name:"张三",age:18}
  2. type keyofa =keyof typeof a

思维导图

 

any和unknow的区别

unknow 是更加安全的any类型

任何类型可以给any , any也可以给任何类型

任何类型也可以给unknow但是unknow只能给unknow和any

函数重载

重载签名 :包含了函数的参数类型和返回值类型,但不包含函数体

函数签名(定义了函数的类型 不包括实现) + 签名实现

 函数签名

  1. 函数类型的第一种情况
  2. function greet(name:string) :string
  3. 函数类型的第二种情况
  4. function greet(name:string[]):string[]

签名实现

函数参数和函数的返回值要覆盖前面的函数前面的所有情况

  1. function gerrt(name:unknown) :unknow{
  2. if(Array.isArray(name)){
  3. return name.map((item)=>`Hello${item}`)
  4. }
  5. return `Hello${name}`
  6. }
  7. greet('xxx') // 后跟字符串方法
  8. greet(['1','2']) //数组方法

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发