【问题标题】:Is there a type-level way to extract properties that have default from a class?是否有一种类型级别的方法可以从类中提取具有默认值的属性?
【发布时间】:2019-12-09 11:00:57
【问题描述】:

我想提取类中具有默认值的属性的键名。这些信息是否可用于类型系统?

class Foo {
  hasDefault: boolean = true
  alsoHasDefault: number = 42
  noDefault: boolean
}

// How can this be implemented?
type DefaultPropertyNames<T> = ... 

// Example output:
type FooDefaults = DefaultPropertyNames<Foo> // -> 'hasDefault' | 'alsoHasDefault'

【问题讨论】:

  • 不,信息不在类型系统中。您可以创建另一种方法来指定默认值,但直接它不可用

标签: typescript typescript-types


【解决方案1】:

我认为“没有默认值”的意思是该值可以是未定义的。目前,您的代码会引发类型错误,因为 noDefault 在其类型定义中不包含 undefined。

所以让我重新提出这个问题:

如何找到类中可能未定义的所有键?

这样的工作:

type DefaultPropertyNames<T> = Exclude<{
    [K in keyof T]: {key: K, value: T[K] extends T[K] & {} ? true : false}
}[keyof T], {value: false}>["key"]

playground

稍微解释一下:

  • T[K] &amp; {} 从类型中删除 undefined

  • T[K] extends T[K] &amp; {} 告诉你 undefined 是否在联合类型中

  • {[K in keyof T]: ... }[keyof T] 根据每个属性键创建联合类型

  • Exclude 允许您从联合类型中删除项目。

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多