如何在TypeScript中从接口中提取一些属性?

smtd7mpg  于 2023-03-19  发布在  TypeScript
关注(0)|答案(2)|浏览(167)

例如,我为帖子定义了一个如下结构:

interface PostsInfo{
    md_content    :string;
    id            :number;
    title         :string;
    description   :string;
    update_time   :Date;
    create_time   :Date;
    comment_count :number;
}

然后,我需要另一个没有md_content属性的接口。

interface PostsInfoWithoutContent{
    // How define?
}

它可以立即修复这个问题,使PostsInfo扩展PostsInfoWithoutContent,但是,如果我这样做了,当我需要PostsInfoWithoutComment(从PostsInfo中删除comment_count)时,我该怎么做呢?

k4emjkb1

k4emjkb11#

您可以使用内置的Pick类型获取接口的一部分:

type PostsInfoWithoutConent= Pick<PostsInfo, "id" | "title">

如果只想排除一个属性,最好定义Omit类型并使用它

type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T];  
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>; 
type PostsInfoWithoutContent= Omit<PostsInfo, "md_content">
1mrurvl1

1mrurvl12#

以下信息可能也很有用:
如果只想获取接口内部属性的类型,可以使用查找类型:

interface Person {
  name: "Paul"|"Peter"|"Percy";
}

// (1) 'Pick' result: {name: "Paul"|"Peter"|"Percy"}
type AllowedNames = Pick<Person, "name">
// in this case you want to prefer using an interface instead

// (2) 'Lookup Types' result: "Paul"|"Peter"|"Percy"
type AllowedNames = Person["name"]

示例:我必须访问compactType的允许值,这是CoreProps(react-grid-layout)中的一个键,并且CoreProps已被导出。我花了一段时间才停止强制Pick进入它。

相关问题