TS常用类型

发布时间:2023年12月28日

原始类型使用

// 原始类型使用
let age: number = 18

let myName: string = '前端'

let isLoding: boolean = false

let a: null = null

let b: undefined = undefined

let s:symbol = Symbol()

数组类型使用

// 数组类型的两种写法

// 写法一
let numbers: number[] = [1, 2, 3] // 数值类型数组
// 写法二
let strings: Array<string> = ['a', 'b'] // 不推荐写法,懂这种写法即可

联合类型使用

// 联合类型

// 数组中既有number类型又有string类型
const arr: (number | string)[] = [1, 'a']

// 不添加小括号,表示arr1既可以是number类型也可以是string[]类型
const arr1: number | string[] = 123;

类型别名(自定义类型)

// 类型别名(自定义类型)

type CustomArray = (number | string)[]

const arr: CustomArray = [1, 'a']
const arr1: CustomArray = ['111']

函数类型(单独指定参数和返回值的类型和同时指定参数和返回值的类型)

// 单独指定参数和返回值的类型
// 写法一
function add(num1: number, num2: number): number {
    // (num1: number, num2: number)是指定参数类型
    // 紧跟后面的: number是指定返回值的类型
    return num1 + num2
}
console.log(add(1, 2));

// 写法二
const minus = (num1: number, num2: number): number => {
    return num2 - num1
}
console.log(minus(1, 2));


// 同时指定参数和返回值的类型
// 1. 当函数作为表达式时,可以通过类似箭头函数形式的语法来为函数添加类型
// 2. 这种形式只适用于函数表达式
const add1: (num1: number, num2: number) => number = (num1, num2) => {
    return num1 + num2
}

console.log(add1(11, 22));

void类型

// void类型
// 如果函数没有返回值,那么函数的返回值类型为void

function greet(name: string): void {
    console.log(name)
}

greet('jack')


函数可选参数

// 函数可选参数

function mySlice(start?: number, end?: number): void {
    console.log(start, end);
}

mySlice();
mySlice(1);
mySlice(1, 3);

对象类型

// 对象类型

let person: {
    name: string
    age: number
    sayHi(): void
    greet: (name: string) => void
} = {
    name: 'jack',
    age: 18,
    sayHi() { },
    greet: (name) => { }
}

对象可选属性

// 对象可选属性

function myAxios(config: { url: string; method?: string }) {
    console.log(config)
}

myAxios({ url: '' })

接口(interface)

// 接口(interface)

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

let person: IPerson = {
    name: '前端',
    age: 35,
    sayHi: () => { }
}


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

/**
 * 接口(interface)和类型别名(type)的对比
 * 
 * 相同点:都可以给对象指定类型
 * 不同点:
 *      1. 接口,只能为对象指定类型
 *      2. 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名
 * 
 */

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

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

let person: IPerson = {
    name: '前端',
    age: 35,
    sayHi: () => { }
}


接口继承

// 接口继承

interface Point2D {
    x: number
    y: number
}

// 这样写麻烦有重复代码
// interface Point3D {
//     x: number
//     y: number
//     z: number
// }

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


const p3: Point3D = {
    x: 1,
    y: 2,
    z: 3
}

元组(场景:1. 在地图中,使用经纬度坐标来标记位置信息 2. 确切地知道包含多少索引以及类型时使用)

// 元组(场景:在地图中,使用经纬度坐标来标记位置信息)

// 不严谨,因为该类型number[]的数组中可以出现任意多个数字
// const position: number[] = [39, 11, 1, 2, 3]

// 更好的方式:元组(Tuple)
const position: [number, string] = [3, '4']

类型推论

// 类型推论(声明变量但没有初始化值,此时必须手动添加类型)
// 注意:能省略类型注解的地方就省略,充分利用TS类型推论的能力,提升开发效率
// 如果不知道类型,可以通过鼠标放在变量名称上,利用VSCode的提示来查看类型

let age = 18
// 类型保护机制也是存在的, 因此会报错
// age = ''


// 函数也是可以自动推论, 建议参数必须添加类型
function add(num1: number, num2: number) {
    return num1 + num2
}

add(1, 3)

文章来源:https://blog.csdn.net/weixin_50236973/article/details/135254495
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。