企业网站定制开发02 ts 变量定义,类型

 

目录


变量声明

在ts企业网站定制开发中定义变量需要指定标识符类型,

var/let/const 标识符: 数据类型 = 赋值

企业网站定制开发当我们没有写数据类型时,ts企业网站定制开发也会帮助我们进行类型推断,企业网站定制开发但是能写还是要写的

  1. // let企业网站定制开发企业网站定制开发进行类型推导,企业网站定制开发推导出来的是通用类型
  2. // const 进行类型推导,企业网站定制开发推导出来的是字面量类型
  3. let age = 18
  4. age = 19
  5. const name = 'zhao'
  6. name = 'yun' //报错

string类型 

  1. // string 小写 ts中字符串类型
  2. // String 大写 js中包装类
  3. // 支持模板字符串拼接
  4. const message: string = "hello ts"

number类型

  1. // 不区分整形与浮点型,ts也支持二进制,八进制,十六进制
  2. let age: number = 18

  1. // 只有true false
  2. let bol: boolean = true

Array类型

  1. // 数组存放元素要确定,
  2. // 存放不同类型是不好习惯
  3. const names: Array<string> = [] // 不推荐 jsx中有冲突
  4. const names2: string[] = [] // 推荐

Object类型

  1. // Object类型
  2. // 不要info: Object这样写 之后取值时报错
  3. // 一般都是让它类型推导
  4. const info: Object = {
  5. name: 'yun',
  6. age: 18
  7. }

symbol类型

  1. // 用的较少
  2. const title1: symbol = Symbol('title')
  3. const title2: symbol = Symbol('title')
  4. const youInfo = {
  5. [title1]: "程序员",
  6. [title2]: "教师"
  7. }

null与undefined类型

  1. // null类型只有一个值 null
  2. const n1: null = null
  3. // undefined类型只有一个值 undefined
  4. const n2: undefined = undefined

any类型

  1. // 当我们无法确定变量类型,且它可能变化,我们可以使用any
  2. // 我们可以对any类型的变量进行任何操作
  3. // 如果你项目中所有地方都使用any,则与js没有区别
  4. let message: any = "hello"
  5. message = 123
  6. message = {
  7. }
  8. const arr: any[] = ["shi", 18, 18]

unknown类型

  1. // 用于描述类型不确定的变量
  2. // 与any的区别: any声明的变量可以赋值给任意变量,unknown只能赋值给unknown与any
  3. // 在any上进行任何操作都是合法的
  4. // 在unknown上进行任何操作都是不合法的,必须进行类型缩小
  5. let res: unknown
  6. let fiag = true
  7. if (fiag) {
  8. res = "str"
  9. } else {
  10. res = 123
  11. }

void类型

  1. // void通常指定一个函数是没有返回值的,那它的返回值就是void类型
  2. // 我们可以将null undefined赋值给void类型,也就是函数可以返回null与undefined
  3. function sum(num1: number, num2: number): void {
  4. console.log(num1 + num2);
  5. }
  6. // 最常写的方式
  7. // 定义要传入的函数类型
  8. type ExecFnType = (...args: any[]) => void
  9. // 当基于上下文的类型推导,当推导出的类型为void时,并不会强制函数一定不能返回内容
  10. const names = ['zhang','li']
  11. names.foreach(()=>{
  12. return 123 // 不报错,可以这样写
  13. })

never类型(了解)

 tuple类型

  1. // 应用场景 react中usestate函数
  2. // 在函数中使用元组类型是最多的(函数的返回值)
  3. function useState(initValue: number): [number, (newValue: number)=>void]{
  4. let stateValue = initValue
  5. function setValue(newValue: number) {
  6. stateValue = newValue
  7. }
  8. return [stateValue, setValue]
  9. }

 函数的参数与返回值

  1. // 函数的返回值类型一般不写
  2. function sum(num1: number, num2: number): number {
  3. return num1 + num2
  4. }
  5. const names = ["shi", "yun", "ya"]
  6. // 匿名函数,称之为上下文类型,ts会自动推断item类型
  7. names.map(item => {
  8. })

对象类型

  1. function friendInfo(friend: {name: string,age: number}) {
  2. console.log(friend.name,friend.age);
  3. }
  4. friendInfo({name:"yun",age:123})

可选类型 ?

  1. // 可选类型,可选可不选,如果没指定类型,就是any类型
  2. function friendInfo(friend: {name: string,age: number,mom?: string}) {
  3. console.log(friend.name,friend.age);
  4. }
  5. friendInfo({name:"yun",age:123})
  6. friendInfo({name:"ya",age:100,mom:'zhao'})

联合类型 |

ts允许我们使用多种运算符从现有类型中构建新类型

联合类型是由两个或者多个其他类型组成的类型; 表示可以是这些类型中的任何一个值

  1. function printInfo(message: number|string|boolean) {
  2. }
  3. printInfo(123)
  4. printInfo("abc")
  5. printInfo(false)
  6. // 联合类型与可选类型关系,可选类型可以看做是类型与undefined的联合类型
  7. function printMes(message?: string) {
  8. }
  9. printMes("xxx")
  10. printMes()
  11. printMes(undefined)

类型别名  type

 当我们某些类型会重复使用时,我们可以抽取出来,设置类型别名

  1. type IdType = number | string | boolean
  2. function printId(id: IdType) {
  3. console.log(id);
  4. }
  5. printId(1)
  6. printId("22")
  7. printId(false)

 接口interface

  1. // 前面我们是用type声明对象类型
  2. type point1 = {
  3. x: number,
  4. y: number,
  5. z?: number
  6. }
  7. // 我们也可以用接口来声明
  8. interface point2{
  9. x: number,
  10. y: number,
  11. z?: number
  12. }
  13. // type别名与interface接口区别
  14. // 1.type可以声明多种类型,interface只能声明对象
  15. type IdType = string|number
  16. // 2.type别名不能重复,interface可以
  17. interface person{
  18. name: string,
  19. age: number
  20. }
  21. interface person{
  22. height: number
  23. }
  24. const xiaoming: person = {
  25. name: 'zhao',
  26. age: 18,
  27. height: 1.88
  28. }
  29. // 3.interface支持继承
  30. interface animal{
  31. name: string
  32. eat: boolean
  33. }
  34. interface dog extends animal {
  35. run: boolean
  36. }
  37. const mydog: dog = {
  38. name: 'xiaohua',
  39. eat: true,
  40. run: true
  41. }
  42. // 4. interface可以被类实现(以后讲)
  43. // 总结: 定义对象类型推荐interface,其他类型type

交叉类型 &

 我们通常是对对象类型进行交叉

  1. // 交叉类型 两种或多种类型要同时满足
  2. type NewType = number & string // 这是没有意义的
  3. // 常见使用方式
  4. interface Ikun{
  5. name: string,
  6. age: number
  7. }
  8. interface Coder{
  9. name: string,
  10. coding: ()=>void
  11. }
  12. const info: Ikun & Coder = {
  13. name: 'zhao',
  14. age: 18,
  15. coding: ()=>{
  16. console.log("coding")
  17. }
  18. }

类型 as

TypeScript只允许类型断言转换为 更具体 或者 不太具体 的类型版本,此规则可防止不可能的强制转换

  1. class Person {
  2. }
  3. class Student extends Person {
  4. study() {
  5. console.log("学生学习");
  6. }
  7. }
  8. function fun(item: Person) {
  9. (item as Student).study()
  10. }
  11. const stu1 = new Student()
  12. fun(stu1)
  13. // 不建议的做法
  14. const message: string = "hello"
  15. const num1: number = (message as any) as number

 还有一个较多的应用场景是js获取dom元素,比如getElementById()ts显示是HTMLElement对象,可以使用断言,断言成具体的,从而添加属性或使用方法

非空类型断言 !

 ! 表示可以确定某个标识符是有值的,跳过ts在编译阶段对他的检测

  1. // 这种情况下是编译阶段报错的
  2. function printMes(message?: string) {
  3. // console.log(message.length);
  4. }
  5. // 使用非空断言 !
  6. function printMes2(message?: string) {
  7. console.log(message!.length);
  8. }
  9. printMes2("xxx")

可选链

es11新增特性,非ts独有

当获取对象某个属性时,为undefined就短路,后面不执行了,返回undefined,存在就继续运行

  1. type Person = {
  2. name: string,
  3. friend?: {
  4. name: string,
  5. age: number
  6. }
  7. }
  8. const info: Person = {
  9. name: "yun"
  10. }
  11. console.log(info.name);
  12. // info.friend是可选的,存在undefined的情况,使用可选链,没有值就短路,返回undefined
  13. console.log(info.friend?.name);

??与!!运算符

js的特性,并非ts语法

  1. // !!
  2. // js的特性,一个!是非操作,相当于把一个值变为布尔类型并取反,所以两个!就算是把一个值变为布尔类型
  3. const message: string = "shi yun ya"
  4. const flag: boolean = !!message
  5. console.log(flag);
  6. // ??
  7. // 逻辑操作符 ??左侧有值就使用左侧的值,没值就使用右侧的值
  8. const bol: string = message??""
  9. console.log(bol);

字面量类型

除了前面所示类型,我们还可以使用字面量类型,字面量类型顾名思义就是以值为类型,所以必须与值保持一致

意义:与联合类型使用,可以把范围锁更小

  1. // const message = "shi yun ya"
  2. let message: "shi yun ya" = "shi yun ya"
  3. // message = "hahaha" 报错
  4. // 应用场景,align只能选择声明的四个值
  5. let align : 'left'|'right'|'top'|'bottom' = 'left'
  6. align = 'right'

字面量推理

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