描述对象

  1. type 或 interface
  2. 索引签名 和 映射类型
  3. 问号表示可选
  4. readonly 表示只读

索引签名

type Hash = {
  [k: string]: unknown
  length: number
}

const hash: Hash = {
  name: 'Lance',
  age: 23,
  length: 1
}

type List = {
  [k: number]: unknown
  length: number
}

const list: List = {
  1: 'Lance',
  length: 23
}

映射类型

type Hash = {
  [k in string]: unknown
}
const hash: Hash = {
  name: 'Lance'
}

type List = {
  [k in number]: unknown
}
const list: List = {
  1: 2333
}

Untitled

可选类型 ?

interface defaultProps {
  defaultValue: string
  value?: string // 问号表 可选 :可不写,也可赋值 undefined
  onChange?: () => void
}

const props: defaultProps = {
  defaultValue: '',
  value: undefined
}

Untitled

只读类型 only

interface User {
  readonly id: number
  readonly name: string
  readonly scores: number[]
  age?: number
}

const u: User = {
  id: 1,
  name: 'Lance',
  scores: [23, 24]
}
u.id = 2
// ^-- Cannot assign to 'id' because
// it is a read-only property.ts(2540)
u.scores[0] = 100
// 不报错

对象的语法全都适用于函数

type F = {
  (a: number, b: number): number
  count?: number
}
type F1 = (a: number, b: number) => number

const f: F = (x, y) => {
  return x + y
}
// f.count = 2

声明函数的方式

// 第一种: 先写类型再赋值
type F1 = (a: number, b: number) => number
const f1: F1 = (a, b) => a + b

// 第二种: 先实现箭头函数,再获取类型
const f2 = (a: number, b: number): number => {
  return a + b
}
type F2 = typeof f2

// 第三种: 先实现普通函数,再获取类型
function f3(this: unknown, a: number, b: number): number {
  return a + b
}
type F3 = typeof f3

// 第四种: 先实现匿名普通函数,再获取类型
const f4 = function(this: unknown, a: number, b: number): number {
  return a + b
}
type F4 = typeof f4