基础类型open in new window

类型推断

当没有明确设置类型时,系统会根据值推断变量的类型

字符串

let m = 'mkimq.com' // const m:string
m = 18 // error

数值

ts 中的数值类型包括了小数、负数、整数

let m = 100 // let m: number
m = 100.1
m = -100

布尔值

值为 true 或 false 会被推断为 boolean类型

let m = true // let m: boolean

数组

下面是数组类型的推断结果,表示数组内容值为字符串

const m = ['mkimq'] // const m: string[]

// 下面会推断数组允许的值为字符串或数值
const m = ['mkimq', 100] // const m: (string|number)[]

对象

ts 也可以推断字面量类型

const user = {
    name: 'mkimq',
    age: 18,
    open: true
}
const user: {
    name: string,
    age: number,
    open: boolean
}

基本类型

字符串

字符串使用string 来声明

const m: string = 'mkimq.com'

数字

在 TS 中不区分整数与浮点数,都使用 number 来声明

const m: number = 100

布尔

使用 boolean 来声明布尔类型

const m: boolean = true

数组

// 下面是对数组值类型为字符串
const m: string[] = []

// 也可以使用泛型来声明数组
const m: Array<strig> = []

元组

明确数组每个成员值类型的数组为元组

const m: [string, number, boolean] = ['mkimq.com', 2020, true]

对象

// 下面是声明对象类型但不限制值类型
let m: object
m = {name: 'mkimq'}
m = {}
m = []
m = Object.prototype // 原型对象
m = 'mkimq' // error 改变了类型为字符串

// 限定对象值类型
const m: {name: string, year: number, url?: string} // ? 用来指定 url 为可选值,这样的属性是非必填项

union

可以同时为声明联合类型,下面是为变量声明字符串或数值类型

let m: string | number = 'mkimq.com'
m = 100

// 为数组声明多种类型
const m: (string | number | boolean)[] = []

// 可以使用泛型方式声明
const m: Array<string|number|boolean> = []

any

使用 any 指包含所有值的顶部类型,所以any不进行类型检查,等于关闭了 TS 对该变量的严格类型校验

  • 使用any 类型等同于使用纯 JavaScript 的开发方式
  • any 类型是顶部类型,所有其他类型是他的子类型
  • 使用any类型将失去 typescript 静态类型的强制检测
  • 只有在描述一个根本不知道的类型时使用 any
let m: any
m = 'mkimq'
m = 100
m = true
m = [1]
m = {name: 'mkimq'}

any 太过宽泛所以不建议使用,他会丢失 TS 的严格类型校验 设置 tsconfig.json 的 noImplicitAny=true 配置项,可以禁止隐含的any 类型。

unknown

unknown 类型也是顶部类型这与 any 一样

  • unknown 用于表示未知的类型
  • 与 any 的区别是 any 不进行 TS 校验,unknown 类型要安全得多,会进行 TS 的类型检查
  • 使用 unknown 类型时一般需要 as 类型断言来转换类型

unknown 赋值时要求明确类型

// 下面是 any 与 unknown 赋值上的区别,unknown 需要明确类型后赋值,any 则不需要
let m: any = 'mkimq'
let mk: unknown = 'mankueng'

let a: string = m
let b: string = mk // error
let b: string = mk as string

借助 unknown 转换类型

let m: string = '99'
let mk: number = m as number // error
let mk: number = m as unknown as number // ok

void

void类型的值为 null 或undefined,常用于对函数返回值类型定义

  • 严格模式下只能是 undefined(有关 TS 配置会在后面章节介绍)
  • 如果函数没有返回值请使用 void 类型,这会使用代码更易读,并可对不小心造成的函数返回内容进行校验
  • 你也可以将 void理解为对返回 null或undefined的函数返回值声明

void 类型的值可以是 null 或 undefined,但如果 TS 配置开启了 strict 或 strictNullChecks则不允许 void 为null

let m: void = undefined
let mk: void = null

void 不允许设置其他类型

void 限定后是不允许函数返回内容的

function fn(): void { // error
    return 'mk'
}

never

相比其他类型来讲 never 使用的机会相对较少。

函数返回值使用never与 void 的区别是

  • void 是有null 或undefined 值的
  • never 是永远不会结束的函数,所以也不会有返回值
function fn(): never {
    throw new Error('出错了~')
}

null & undefined

null 与undefined 也是对变量类型,用于定义值为 null 或 undefined

let m: null = null
let mk: undefined = undefined

当配置项启用 strictNullChecks 时,null 与 undefined 只能赋值给 void、null、undefined 类型

函数

函数定义

下面是 TS 自动推断的函数类型

let fn = () => 'mkimq'

fn = 'mkimq.com' // error

下面是使用显示类型定义函数

let fn: Function

fn = () => 'mkimq.com'

注意类型要使用大写的Function 这与 string/number/boolean 是有区别

参数类型

function sum(a: number, b: number, radio?: number) {
    return a +b
}

返回值类型

function sum(a: number, b: number): number {
    return a + b
}

参数声明

type userType = {
    name: string,
    age: number
}

function (user: userType): void {}

函数定义

type userType = {
    name: string,
    age: number
}

type addUserFunc = (user: userType) => boolean

const addUser: addUserFunc = (u: userType): boolean => {
    return true
}

剩余参数

下面的求合函数接收多个参数

function sum(...args: number[]): number {
    return args.reduce((s, n) => s + n, 0)
}

// 下面通过第二个参数接收剩余参数,来实现数据追加的示例
function push(arr: any[], ...args: any[]): any[] {
    arr.push(...args)

    return arr
}

Tuple元组

元组与数组类似,但元组要为每个值进行类型声明。

const arr: (number | string | boolean)[] = [100, 'mkimq', false]
贡献者: mankueng