Skip to content

ts重要知识点 #23

Open
Open
@keep-run

Description

@keep-run

索引类型( keyof & T[K ])

使用索引类型,编译器可以检查使用动态属性名的代码。

  • 索引类型查询操作符:keyof。对任何类型Tkeyof T为已知类型T的属性名的联合,比如
interface Person {
    name: string;
    age: number;
}
let personProps:keyof Person    //personProps:"name" | "age"
  • 索引访问操作符:T[K]
interface Person {
  name: string;
  age: number;
}
function demo<T extends object, K extends keyof T>(obj: T, names: K[]): T[K][] {
  return names.map(item => obj[item])
}
let people: Person = {
  name: "test",
  age: 21
}
let res1 = demo(people, ["name"])  //string[] 类型
let res2 = demo(people, ["name",'age'])   //(string|number)[] 类型

T[K] 表明people['name']的类型为Person['name']。

接口(interface) 和 类型别名(type)的区别

类型别名和接口用法相似,但是还是有细微区别

  • 接口创建了新的名字,鼠标放上去,展示的就是接口名,别名没有创建新名称,鼠标悬停展示的是字面量。
  • 类型别名不能被 extends和 implements;

类型区分&类型保护

用户自定义的类型保护

interface Bird {
    fly();
    layEggs();
}

interface Fish {
    swim();
    layEggs();
}
// 有一个变量是Bird或者Fish中的一个,如何区分?
function isFish(pet:Fish|Bird):pet is Fish{
    return (<Fish>pet).swim!==undefined
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions