打字稿:重新映射值深度对象

Typescript: Remap values deep object

如何从深层对象中选取属性?似乎T[key]['default']在映射类型中是不允许的?

type MyModule = {
  title: {
    default: string
  },
  length: {
    default: number
  }
}

// expected type
type NewMyModule = {
  dataModel: string; // type of 'default' prop
  length: number; // type of 'default' prop
}


// error message: 'default' can't be used to index type 'T[key]'

type PickDefault<T> = {
  [key in keyof T]: T[key]['default']
}

Typescript 对你大喊大叫的原因是它不知道键 default 是否存在于类型 T[key] 上。您可以采用两种方法来解决此问题。第一个是限制输入类型参数 T Typescript 知道 T[key] 的类型是什么。见下文。

type PickDefault<T extends Record<keyof any, { default: unknown }>> = {
  [key in keyof T]: T[key]['default'];
}

您还可以做的是使用类型推断。见下文。

type PickDefault2<T> = {
  [key in keyof T]: T[key] extends { default: infer D } ? D : never;
}

第二种方法的一个警告是,如果在 T[key] 上找不到 default,它不会引发任何错误。相反,它只会将类型替换为 never。而第一种方法只允许适当的类型通过。