typescript - Partial<SomeClass> 但没有方法?

标签 typescript

我经常使用构造函数创建一个类,该类可以采用适合该类的任意成员:

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/

相关文章:

typescript - 在 Typescript 中,如何检查字符串是否为数字

css - Angular 4 CSS DIV 背景图像绑定(bind)不起作用

javascript - 将元素拖到其可滚动父 div 之外 - ( React-Draggable )

angular - 我如何使用 Angular 语言服务?

javascript - TypeScript 类型 'string | null' 无法分配给类型 'string'

javascript - Angular2 服务的现场问题

angular - 从 google.maps.event.listener 调用我的函数

javascript - 合并 javascript 中的对象,同时忽略未定义的属性值(jQuery.fn.extend 行为)

angular - 在带有模板的 Angular ng-bootstrap 模式中,关闭和关闭按钮不起作用

javascript - 如何在 map 后的点击中获取原始可观察值?