描述对象
- type 或 interface
- 索引签名 和 映射类型
- 问号表示可选
- 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
}
可选类型 ?
interface defaultProps {
defaultValue: string
value?: string // 问号表 可选 :可不写,也可赋值 undefined
onChange?: () => void
}
const props: defaultProps = {
defaultValue: '',
value: undefined
}
只读类型 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