我经常使用构造函数创建一个类,该类可以采用适合该类的任意成员:
class SomeClass {
propA: string;
propB: number;
constructor(obj: Partial<SomeClass>) {
Object.keys(obj).forEach(key => this[key] = obj[key]);
}
}
那么我可以做 new SomeObject({propA: 'whatever'})
或 new SomeObject({propB: 3})
或任何组合(显然,当有更多属性时,这更有用。(假设这是一个低风险的个人项目,我们可以忽略不写这样的构造函数的任何原因。)
所以,这很棒,这也意味着 Intellisense 会在我构建类的新实例时向我显示选项。
但是,该 Intellisense 列表还包括类的方法(尽管我的示例没有任何方法,但我认为您明白了)。
Partial<SomeClass>
是否有变体或约束?那只会允许属性?而且由于我经常使用箭头函数,我猜它们是不是函数的属性(因为我认为箭头函数在技术上是属性而不是方法)。
最佳答案
您可以使用映射 + 条件类型获取不具有以下功能的键:
type NonMethodKeys<T> = {
[K in keyof T]: T[K] extends Function ? never : K
}[keyof T]
这会遍历所有对象键,如果是函数,则将属性类型设置为 never
, 否则不管是什么键 K
是。然后你用 [keyof T]
索引它返回所有非 never
的值.这为您提供了一个不起作用的属性名称的联合。然后你可以简单地
Pick
来自一个类型的那些键。type WithoutMethods<T> = Pick<T, NonMethodKeys<T>>
然后像这样使用它:type A = WithoutMethods<{ a(): number, b: string}> // type: { b: string }
或者在你的情况下:constructor(obj: Partial<WithoutMethods<SomeClass>>) { /* ... */ }
Playground在 typescript 4.1(未发布,目前处于测试阶段)中,使用 Key Remapping in Mapped Types 会更容易一些。和一个
as
映射键的子句。通过将 key 映射到 never
,省略。type WithoutMethods<T> = {
[K in keyof T as
T[K] extends Function ? never : K
]: T[K]
}
type A = WithoutMethods<{ a(): number, b: string}> // type: { b: string }
Playground
关于typescript - Partial<SomeClass> 但没有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64490108/