TypeScript 学习笔记

date
Apr 5, 2023
slug
learn-ts
status
Published
tags
summary
type
Post

const 断言

const info = {
	url: "xxx", // string
	method: "post" // string
}


const info2 = {
	url: "xxx", // readonly "xxx"
	method: "post" // readonly "post"
} as const

映射类型

type Pair = "BTCUSD" | "ETHUSD" ;
interface PairId {
  [key: Pair]: string;
}
// 报错:An index signature parameter type cannot be a literal type or a generic type
在 TypeScript 中,索引签名的参数类型不能是字面量类型(literal type)或者泛型类型。
使用映射类型的写法:
type Pair = "BTCUSD" | "ETHUSD" ;
type PairId = {
  [key in Pair]: string;
}

函数类型表达式和调用签名

type BarType = (num1: number) => number // 1.类型表达式:加上形参名字

interface IBar {
	name: string
	(num1: number): number; // 2.调用签名:(参数列表):返回值
	(num2: number): Promise<number>; // 异步函数的写法
}
开发中如何选择:
1。如果只是描述函数类型本身(函数可以被调用),使用函数类型表达式(Function- Type- Expressions)
2.如果在描述函数作为对象可以被调用,同时也有其他属性时,使用函数调用签名(Call Signatures)

构造签名

class Person {
}

interface ICTORPerson {
	new (): Person // 表达的意思:ICTORPerson 可以通过 new 来调用
}

function factory(fn: ICTORPerson) {
	const f = new fn() // f: Person
	return f
}

factory(Person)

函数默认值

有默认值的参数,可以接收 undefined (等同于不写)
function foo(x: number, y = 100) {
	console.log(y + 10)
}

foo(10)
foo(10, undefined) // 与上面等价

函数重载

// 需求:add() 字符串+字符串,数字+数字
// 1. 先编写重载签名
function add(arg1: number, arg2: number): number
function add(arg1: string, arg2: string): string

// 2. 编写通用函数实现
function add(arg1: any, arg2: any): any {
	return arg1 + arg2
}

add(10, 20) // ok
add("aaa", "bbb") // ok
add({name: "aaa"}, "bbb") // err, 通用函数不能被调用

© e 2021 - 2023 site logo