typescript - 用于在 TypeScript 中过滤对象/类的方法的条件类型
问题描述
如何过滤对象的属性以仅获取那些是方法的属性?
const obj = {
a: 1,
b: 'text',
c: () => null,
d: (arg0: number) => arg0 + 1
}
type AllKeys = keyof typeof obj // 'a' | 'b' | 'c' | 'd'
// type OnlyMethodsKeys = (???) // 'c' | 'd'
解决方案
来自https://github.com/microsoft/TypeScript/pull/21316:
type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
type FunctionProperties<T> = Pick<T, FunctionPropertyNames<T>>;
type NonFunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T];
type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;
所以我们可以这样做:
type OnlyMethodsKeys = FunctionPropertyNames<typeof obj> // 'c' | 'd'
也适用于课程:
class C {
a = 1
b = 'text'
c() {
return null
}
d(arg0: number) {
return arg0 + 1
}
}
type AllKeys = keyof C // 'a' | 'b' | 'c' | 'd'
type OnlyMethodsKeys = FunctionPropertyNames<C> // 'c' | 'd'
推荐阅读
- python - 在对非重复变量求和时从列表中消除重复项
- javascript - 来自 jQuery Deferred 的 JavaScript 承诺仅在第一次解决
- php - Laravel Botman 在开发者控制台中给出 404 错误
- java - 如果返回类型为 java.sql.Timestamp,则基于接口的投影 getter 方法会给出异常
- javascript - 按钮未单击我使用了 javascript 和 Actions 语法
- java - java GMT datetimeparse
- ruby-on-rails - Rails 4:JSON::GeneratorError:JSON 中不允许 NaN
- git - 我可以让 Git 在不实际提取提交数据的情况下获取存储库标记列表吗?
- javascript - 是否有可能从 JavaScript 中的嵌套处理程序方法访问类方法?
- c# - 使用 Enter 键更改用户控件中文本框的焦点