1. 声明、参数、返回值
1.1 声明
1.1.1 深入对象语法
type Name = {
name: string
}
type NameChild = { name: string; age: number } | { name: string; age: string }
接口实现
interface Name {
name: string
}
type Hash = {
[k: string]: unknown
length: number
}
type List = {
[k: number]: unknown
length: number
}
type Hash = {
[k in string]: unknown
}
type List = {
[k in number]: unknown
}
interface InputProps {
defaultValue?: string
value?: string
onChange?: () => void
}
const props: InputProps = {}
interface User {
readonly id: number
readonly name: string
readonly scores: number[]
age?: number
}
const u: User = {
id: 1,
name: 'lwz',
scores: [99, 98],
}
u.scores[0] = 100
u.scores[1] = 100
console.log(u)
/**
* 描述对象
* 1. type or interface
* 2. 索引签名 和 映射类型
* 3. 问号表示可选
* 4. readonly表示只读
*/
1.1.2 深入函数
type F = {
(a: number, b: number): number
readonly count?: number
}
type F1 = (a: number, b: number) => number
const f: F = (x, y) => {
return x + y
}
1.1.3 声明函数的4种方法
function f1(a: number): number {
return a + 1
}
type F2 = (x: number) => number
const f2: F2 = function (a) {
return a + 1
}
type F3 = (x: number) => number
const f3: F3 = (a) => {
return a + 1
}
const f4 = (a: number, b: number): number => {
return a + b
}
type F4 = typeof f4
1.1.4 类型谓词
type Person = {
name: string
}
type Animal = {}
function f1(a: Person | Animal) {
if (isPerson(a)) {
a
}
}
function isPerson(x: Person | Animal): x is Person {
return 'name' in x
}
const isPerson2 = (x: Person | Animal): x is Person => 'name' in x
1.1.5 参数的相关语法
function addEventListener(eventType: string, fn: (e: Event, el: Element) => void, useCapture = false) {
const element = {} as HTMLElement
const event = {} as Event
fn(event, element)
// 浏览器实现
console.log(eventType, fn, useCapture)
}
// 可选参数的实现方式二: 问号
// function addEventListener(eventType: string, fn: unknown, useCapture?: boolean) {
addEventListener('click', () => {
return 1
})
1.1.6 函数的柯里化
const add = (a: number, b: number) => a + b
const createAdd = (a: number) => (b: number) => a + b
add(6, 14)
createAdd(6)(14)
type CreateAdd = (x: number) => (y: number) => number
const createAdd1: CreateAdd = (a) => (b) => a + b
2. 函数重载、this和as count
2.1 函数重载
function print(x: string | number | boolean) {}
function createDate(n: number): Date
function createDate(year: number, month: number, date: number): Date
function createDate(a: number, b?: number, c?: number): Date {
if (a !== undefined && b !== undefined && c !== undefined) {
return new Date(a, b, c)
} else if (a !== undefined && b === undefined && c === undefined) {
return new Date(a)
} else {
throw new Error('只接受一个或三个参数!')
}
}
createDate(1000)
createDate(2011, 0, 1)
function createDateFromNumber(n: number): Date {
return new Date(n)
}
function createDateFromYMD(year: number, month: number, date: number): Date {
return new Date(year, month, date)
}
createDateFromNumber(1000)
createDateFromYMD(2011, 0, 1)
2.2 指定函数的this
type Person = {
name: string
}
function f(this: Person, word: string) {
console.log(this.name + ' ' + word)
}
const p: Person & { f: typeof f } = { name: 'lwz', f: f }
p.f('hi')
const p1: Person = { name: 'lwz' }
f.call(p1, 'hi')
f.apply(p, ['hi'])
const f2 = f.bind(p)
f2('hi')
f.bind(p)('hi')
2.3 剩余参数
function sum(name: string, ...array: number[]) {
// let result = 0
// for (let i = 0; i < array.length; i++) {
// result += array[i]
// }
// return result
return array.reduce((pre, current) => pre + current, 0)
}
console.log(sum('one', 1))
console.log(sum('two', 1, 2))
console.log(sum('ten', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
2.4 展开参数
function sum(name: number, ...array: number[]) {
f.apply(null, array)
f(...array)
}
function f(...array: number[]) {
console.log(array)
}
2.5 as count
let a1 = 'b' as const
const array = [1, 'hi'] as const
function sum(name: number, ...array: number[]) {
const a = [1, 2] as const
f(...a)
}
function f(a: number, b: number) {
return a + b
}
2.6 函数的更多细节
type Config = {
url: string
method: 'GET' | 'POST' | 'PATCH' | 'DELETE'
data?: unknown
headers?: unknown
}
function ajax({ url, method, ...rest } = { url: '', method: 'GET' } as Config) {
console.log(url, method)
}
function f1(): void {
return
}
function f2(): void {
return undefined
}
function f3(): void {}
function f4(): void {
}
type Fn = () => void
const f: Fn = () => {
return undefined
}