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

Typescript 是否有一种类型级别的方法可以从类中提取具有默认值的属性?,typescript,typescript-types,Typescript,Typescript Types,我想提取具有默认值的类中属性的键名称。该信息是否可用于类型系统 class-Foo{ hasDefault:boolean=true 默认值:数字=42 noDefault:boolean } //如何实现这一点? 类型DefaultPropertyNames=。。。 //示例输出: 键入FooDefaults=DefaultPropertyNames/->'hasDefault'|'alsoHasDefault' 我认为您所说的“无默认值”是指该值可以不定义。当前,您的代码抛出一个类型错误,因

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

class-Foo{
hasDefault:boolean=true
默认值:数字=42
noDefault:boolean
}
//如何实现这一点?
类型DefaultPropertyNames=。。。
//示例输出:
键入FooDefaults=DefaultPropertyNames/->'hasDefault'|'alsoHasDefault'
我认为您所说的“无默认值”是指该值可以不定义。当前,您的代码抛出一个类型错误,因为
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"]
type DefaultPropertyNames=Exclude[“key”]

稍作解释:

  • T[K]&{}
    从类型中删除
    未定义的

  • T[K]扩展T[K]&{}
    告诉您联合类型中是否存在未定义

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

  • Exclude
    用于从联合类型中删除项目


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