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

问题描述 投票:1回答:1

如果我有类似的界面:

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];
};
typescript
1个回答
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;
// }
© www.soinside.com 2019 - 2024. All rights reserved.