Typescript基础

本文介绍了TypeScript与JavaScript的关系,静态类型的优势,以及如何通过TypeScript的特性如接口、类型别名和元组提高代码质量。涵盖了安装、数据类型、自定义类型和高级概念如联合类型、函数类型和接口继承等内容。

1.typescript与Javascript

js是动态类型弱类型语言,而ts是静态类型弱类型语言。

强类型语言:不允许改变变量的数据类型,除非进行强制类型转换。

弱类型语言:变量可以被赋予不同的值。

静态类型语言:在编译阶段确定所有变量的类型。

动态类型语言:在执行阶段确定所有变量的类型。

2.为什么用TypeScript

静态类型,基于语法解析TSDoc,ide增强使可读性增强。在编译阶段即可暴露出大部分错误,致使可维护性增强。因此使得ts在多人合作的大型项目中可以获得更好的稳定性和开发效率。

js的超集,简单来说,就是js的代码都可以在ts里面运行,因此也可以把ts理解为type+js。

3.安装ts

npm i -g typescript

安装之后,在cmd中输入tsc -v  ,如果出现了版本号,代表安装成功。

4.ts的数据类型

ts的数据类型有两种,一种是js原有的数据类型,一种是新增的数据类型

原有数据类型

原始类型:number/string/bollean/null/undefined/symbol

对象类型:object(数组、对象、函数等)

js写法:

let a = 'hhh'
let b = 666
let c = true
let d = null
let e = undefined
let f = {name:'maobuhui'}
let g = 100
let h = Symbol()

ts写法:

let a:string = 'hhh'
let b:number = 666
let c:boolean = true
let d:null = null
let e:undefined = undefined
let f:object = {name:'maobuhui'}
let g:bigint = 100n
let h:symbol = Symbol()

新增类型

  1. 联合类型
  2. 自定义类型(类型别名)
  3. 接口
  4. 元组
  5. 字面量类型
  6. 枚举
  7. void
  8. any
  9. 等等

(1)联合类型

let 变量: 类型1 | 类型2 | 类型3 .... = 初始值
 
let arr1 :number | string = 1 // 可以写两个类型

(2)自定义类型

type 别名 = 类型
type x = string // 定义
const str1:x = 'abc'
const str2:string = 'abc'

(3)数组类型

// 写法1:
let 变量: 类型[] = [值1,...]:
let numbers: number[] = [1, 3, 5] // numbers必须是数组,每个元素都必须是数字
// 写法2:
let 变量: Array<类型> = [值1,...]
let strings: Array<string> = ['a', 'b', 'c'] // strings必须是数组,每个元素都必须是字符串

(4)函数

单个函数

// 普通函数
function 函数名(形参1: 类型=默认值, 形参2:类型=默认值,...): 返回值类型 { }
// 声明式实际写法:
function add(num1: number, num2: number): number {
  return num1 + num2
}
 
// 箭头函数
const 函数名(形参1: 类型=默认值, 形参2:类型=默认值, ...):返回值类型 => { }
const add2 = (a: number =100, b: number = 100): number =>{
   return a + b
 }
 // 注意: 箭头函数的返回值类型要写在参数小括号的后面
add(1,'1') // 报错

统一定义函数格式

const add2 = (a: number =100, b: number = 100): number => {
    return a + b
  }
 
function add1 (a:number = 100 , b: number = 200): number {
    return a + b
  }
// 这里的 add1 和 add2 的参数类型和返回值一致,
// 那么就可以统一定义一个函数类型
type Fn = (n1:number,n2:number) => number
const add3 : Fn = (a,b)=>{return a+b }
// 这样书写起来就简单多啦

(5)函数返回值类型void

function greet(name: string): void {  console.log('Hello', name)  //}

(6)可选参数

可选参数:在可选参数名的后面添加 ?(问号)
function slice (a?: number, b?: number) {
    // ? 跟在参数名字的后面,表示可选的参数
    // 注意:可选参数只能在 必须参数的后面
    // 如果可选参数在必选参数的前面,会报错
    console.log(111);
    
  }
  slice()
  slice(1)
  slice(1,2)
}

(7)对象类型

const 对象名: {
  属性名1:类型1,
  属性名2?:类型2,
  方法名1(形参1: 类型1,形参2: 类型2): 返回值类型,
  方法名2:(形参1: 类型1,形参2: 类型2) => 返回值类型
} = { 属性名1: 值1,属性名2:值2  }
 
// 创建类型别名
type Person = {
  name: string,
  age: number
  sayHi(): void
}
 
// 使用类型别名作为对象的类型:
let person: Person = {
  name: '小花',
  age: 18
  sayHi() {}
}

(8)接口

当一个对象类型被多次使用时,有如下两种方式来来描述对象的类型,以达到复用的目的:

  1. 类型别名,type
  2. 接口,interface

interface 接口名  {属性1: 类型1, 属性2: 类型2}
// 这里用 interface 关键字来声明接口
interface IGoodItem  {
    // 接口名称(比如,此处的 IPerson),可以是任意合法的变量名称,推荐以 `I` 开头
   name: string, price: number, func: ()=>string
}
 
// 声明接口后,直接使用接口名称作为变量的类型
const good1: IGoodItem = {
   name: '手表',
   price: 200,
   func: function() {
       return '看时间'
   }
}
const good2: IGoodItem = {
    name: '手机',
    price: 2000,
    func: function() {
        return '打电话'
    }
}

接口和类型 的区别 interface(接口)和 type(类型别名)的对比:

  • 相同点:都可以给对象指定类型
  • 不同点:
    • 接口,只能为对象指定类型,可以被继承
    • 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名

先有的 interface,后有的 type,推荐使用 type。

(9)接口继承

interface 接口2 extends 接口1 {
 属性1: 类型1, // 接口2中特有的类型
 }
 
interface a { x: number; y: number }
// 继承 a
// 使用 extends(继承)关键字实现了接口
interface b extends a {
  z: number
}
// 继承后,b 就有了 a 的所有属性和方法(此时,b 同时有 x、y、z 三个属性)

(10)元组

元组是一种特殊的数组,可以限制数组的内容和长度。

基础用法

let x: [string,number]
x = ['a',123]
x = [123,'a']//error
x = [123,123,'a']//error

可选参数

let x:[string,number?]
x = ['a']
x = ['a', 123]

剩余元素

let x:[number,...string[]]
x = [123,"q","w","e"]

只读

let x:readonly[number,string] = [123,"q"]
//此时对x进行任何修改都会抛出异常

(11)any

  • any类型的变量可以被重新赋值为任意类型的值,一定程度上any是ts所有数据类型的顶层数据类型。
  • 如果在声明变量的时候没有进行赋值,则自动将该类型转为any类型。
  • 可以任意读取any类型变量的函数或属性,无论是否存在都不回报错。
  • 尽量不要用any。

let a:any = 123
a = "qwe"
let b
b = 111
let cc:any = "aaa"
console.log(cc.firname)//undefined

(12)字面量类型

字符串字面量类型:将字符串字面量作为类型

let sex = 'man' | 'woman'

boolen字面量类型

let type = true | false

number字面量类型

let num = 1 | 2 | 3 | 4 | 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值