如何使用[key:string]删除Typescript类型中的字段:any

时间:2018-05-16 21:30:11

标签: typescript

我有一个来自npm模块的类型定义,想要删除param1或使其成为可选

type A = {
    [key: string]: any,
    param1: string
    param2: string
}

我尝试过Typescript建议的Omit功能,但效果不好

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
type B = Omit<A,"param1">
// expect: B = {[key:string]: any, param2: string}
// actual: B = {[key:string]: any}

我正在使用typescript 2.8.3。我怎样才能得到预期的结果?

更新: 我做了更多的挖掘并发现了以下内容。

// this copies index and extra type correctly
type B = {
  [P in keyof A]: A[P];
}

// this only copies index type
type C = keyof A
type B = {
  [P in C]: A[P];
}

1 个答案:

答案 0 :(得分:0)

依赖于keyof的映射类型(如Exclude)在此处无法正常工作,因为索引签名会吸收其他属性。 keyof A是属性的联合,即string

通过向现有密钥添加?修饰符并为某些属性删除它们,可能会以相反的方式解决问题:

type B = Partial<A> & { param1: A['param1'] };

由于这对于多个属性来说会变得很麻烦,因此可能必须复制和修改类型。