JHHK

欢迎来到我的个人网站
行者常至 为者常成

day01

目录

TS介绍

1、js的超集
ts = 类型 + js,变量类型发生变化时js不会检查,ts会检查

2、区别
ts是静态语言(编译时进行类型检查,可以更早发现错误)

let age: number = 18

// 这句代码报错
age = '20'

age.toFixed()

js是动态语言(执行时进行类型检查,发现错误较晚)

3、转化
ts 命令行工具(编译工具) 转为js 再执行
安装:npm i -g typescript 使用 tsc hello.ts 生成 hello.js 然后 node hello.js
安装:npm i -g ts-node 使用:ts-node hello.ts

类型相关

1、类型注解

let age: number = 18   
age = 20   

2、兼容js已有类型
boolean
number:NAN
string
object:数组、字典、方法、null
undefine

let isLoading: boolean = false

let age: number = 18

let myName: string = '刘老师'

let a: null = null

let b: undefined = undefined

let s: symbol = Symbol()

TS新增类型

联合类型

// 添加小括号,表示:首先是数组,然后,这个数组中能够出现 number 或 string 类型的元素
let arr: (number | string)[] = [1, 3, 5, 'a', 'b']

// 不添加小括号,表示:arr1 既可以是 number 类型,又可以是 string[]
let arr1: number | string[] = ['a', 'b']
let arr1: number | string[] = 123

元组:[number, string, number]

let position: [number, string] = [39, '114']

**数组:number[] 或者 Array**

let numbers: number[] = [1, 3, 5]

let numbers1: Array<number> = [1, 3, 5]

let b: boolean[] = [true, false]

函数类型

(num1:number, num2?:number)=>number
没有返回值就是(num1:number, num2?:number)=>void
参数可以是可选类型且必须位于最后位置

// 1、写法一
function add(num1: number, num2: number): number {
  return num1 + num2
}

// 2、写法二:匿名函数
const add = (num1: number, num2: number): number => {
  return num1 + num2
}

// 3、类型注解:(num1: number, num2: number)=>number
const add:(num1: number, num2: number)=>number = (num1, num2) => {
  return num1 + num2
}

// 调用
console.log(add(3, 2))

对象类型: 属性可以是可选类型

let person: {
  name: string
  age: number
  address?: string   
  // sayHi(): void
  sayHi: () => void
  greet(name: string): void
} = {
  name: '刘老师',
  age: 18,
  sayHi() {},
  greet(name) {}
}

字面量类型

let test:"name" = "name"

你定义了一个变量 test。
它的类型被明确指定为字符串字面量 “name”。
这个变量 只能 被赋值为 “name”,不能赋值为其它字符串。

等价于

type NameLiteral = "name";
let test: NameLiteral = "name";

应用场景举例:联合字面量类型

type Role = "admin" | "user" | "guest";

function setRole(role: Role) {
  // ...
}

setRole("admin"); // ✅
setRole("root");  // ❌ 报错:不能将 "root" 分配给类型 "Role"

自定义类型

type customArray = (string | number)[]    

类型断言
使用as可以让类型变的更具体

const aLink = document.getElementById('link') as HTMLAnchorElement
// const aLink = <HTMLAnchorElement>document.getElementById('link')
aLink.href

类型推断
利用TS类型推论的能力,提升开发效率

// 不需要写类型注解,自动推断为number类型
let num = 10
// 会报错
num = 'hello'


// 如果没有初始化需要指定类型   
let str:string
// 会报错
str = 0
str = 'hello'

对象接口

一、接口

interface IPerson {
  name: string
  age: number
  sayHi(): void
}

let person: IPerson = {
  name: '刘老师',
  age: 18,
  sayHi() {}
}

let person1: IPerson = {
  name: 'jack',
  age: 16,
  sayHi() {}
}

二、接口和type的区别

1、书写上有区别,一个没有等号一个有等号

2、接口,只能为对象指定类型。类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名
type numstr = number | string

// 接口:
interface IPerson {
  name: string
  age: number
  sayHi(): void
}

// 类型别名
type IPerson = {
  name: string
  age: number
  sayHi(): void
}

let person: IPerson = {
  name: '刘老师',
  age: 18,
  sayHi() {}
}

三、接口的继承

interface Point2D {
  x: number
  y: number
}
// interface Point3D { x: number; y: number; z: number }

// 使用 继承 实现复用:
interface Point3D extends Point2D {
  z: number
}

let p3: Point3D = {
  x: 1,
  y: 0,
  z: 0
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.