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, 通用函数不能被调用