有没有一种类型级别的方法可以从类中提取具有默认值的属性?

时间:2019-07-31 21:19:31

标签: typescript typescript-types

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

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'

1 个答案:

答案 0 :(得分:0)

我认为“无默认值”的意思是该值可以不确定。当前,您的代码引发类型错误,因为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] & {}从类型中删除undefined

  • T[K] extends T[K] & {}告诉您union类型是否为未定义

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

  • Exclude可让您从联合类型中删除项目。