创建一个省略所有函数属性的对象类型

时间:2019-12-02 23:33:16

标签: typescript

如果我有这样的界面:

interface User {
  name: string;
  age: number;
  password: string;
  validatePassword(password: string): boolean;
}

我想使用一种实用程序类型,例如OmitFunctions<User>,它将将该类型转换为以下形式:

interface User {
  name: string;
  age: number;
  password: string;
}

这可能吗?我想出了这种映射类型,它将validatePassword的类型更改为never,但是我需要删除validatePassword

type OmitFunctions<T> = {
  [P in keyof T]: T[P] extends Function ? never : T[P];
};

1 个答案:

答案 0 :(得分:1)

您的方法很接近,但是我们的想法是先过滤所需的键,然后从原始类型中选择过滤的键:

interface User {
  name: string;
  age: number;
  password: string;
  validatePassword(password: string): boolean;
}

type KeyNotOfType<T, V> = {
    [P in keyof T]-?: T[P] extends V ? never: P
}[keyof T]

type NoFunction<T> = Pick<T, KeyNotOfType<T, Function>>

type R = NoFunction<User>
// Same as 
// type R = {
//     name: string;
//     age: number;
//     password: string;
// }

Playground Link