函数重载
function greet(name: string):string;function greet(name: string[]): string;function greet(name:unknown):string {if(typeof name === 'string'){return `hello ${name}`} else if (Array.isArray(name)){return `hello ${name.join(',')}`}return 'unkown'}const a = greet('Tom')const b= greet(['Tom', 'Marry'])console.log(a)console.log(b)
索引类型和Record类型
它们两个很多情况下都是一样的,就是索引类型中的key的类型比较少,只能是number、string、symbol
索引类型
索引类型的key只能是number、string、symbol、或者是字面量类型
type AType = {[prop: number|string|symbol|`$${string}Change`]:any}const a:AType ={name: 'Tom',10: 'age'}
不能使用其他的,例如字面量联合类型
type Level ='error'|'warn'|'info'type BType = {[prop:Level]: any}//error 索引签名参数类型不能为文本类型或泛型类型。请考虑改用映射的对象类型。ts(1337)
Record类型
Record类型的中的key的类型是string|number|symbol|T
type PersonKey = 'name'|'age'|'sex'type Person =Record<PersonKey,any>
keyof
type User = {name: string;age: number;sex: boolean}type U1 = User["name"]// stringtype U2 = User["name"|"age"]// string|numbertype U3 = User[keyof User]// string | number | booleanfunction getProperty<T extends object, K extends keyof object>(obj, key) {return obj[key]}
映射类型
type User = {name: string;age: number;sex: boolean}type MyPartial<T> = {[P in keyof T]?:T[P]}type UserPartial = MyPartial<User>;//等同于type UserPartial = {name?: string;age?: number;sex?: boolean;}
key remapping
type MappedTypeWithNewKeys<T> = {[K in keyof T as NewKeyType]: T[K]}
type User = {name: string;age: number;sex: boolean}type Getters<T> = {[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];}type UserGetters = Getters<User>;//等同于下面type UserGetters = {getName: () => string;getAge: () => number;getSex: () => boolean;}//方便的移除类型中的某些Keytype RemoveSexField<T> = {[K in keyof T as Exclude<K, 'sex'>]: T[K]}type UserRemoveSexField = RemoveSexField<User>;//等同于下面type UserRemoveSexField = {name: string;age: number;}//等同于下面type C = Omit<User, 'sex'>
