当前位置: 首页 > 知识库问答 >
问题:

TypeScript为类型的缺少键提供默认值

弘烨烁
2023-03-14

可能有一个非常明显的答案,但如何做到以下几点:

type testStatus = {
    foo: boolean;
    bar: boolean;
    baz: boolean;
}

const makeDefaults = (o: Partial<testStatus>) => {
   const keys = // array of `testStatus` keys?
   keys.forEach(k => !(k in o) && (o[k] = false)) // provide a default value for missing keys
   return o
}

const obj: Partial<testStatus> = { foo: true, bar: false } 

const defaultedObj = makeDefaults(obj) // { foo: true, bar: false, baz: false }

基本上是从一个类型中检索所有键,以循环通过?

共有2个答案

颛孙麻雀
2023-03-14

无法从类型中获取键作为值,因为运行时类型不存在。如果类型很简单,并且其所有键的值类型都与示例中相同-可以先创建键数组,然后从中创建类型:

const KEYS = ['foo', 'bar', 'baz'] as const;

type testStatus = { [K in typeof KEYS[number]]: boolean };

const makeDefaults = (o: Partial<testStatus>) => {
    KEYS.forEach(k => !(k in o) && (o[k] = false))
    return o
}

游戏场

逄嘉木
2023-03-14

类型只在编译时存在,因此您尝试执行的确切操作是不可能的。

一个更简单的选择是

type TestStatus = {
    foo: boolean;
    bar: boolean;
    baz: boolean;
}

const defaultTestStatus: TestStatus = {
    foo: false,
    bar: false,
    baz: false
}


const merge = (partialStatus: Partial<TestStatus>): TestStatus => ({
    ...defaultTestStatus,
    ...partialStatus
})
 类似资料:
  • 问题内容: 在Swift中处理可选选项的习惯用法似乎过于冗长,如果您只想在nil为零的情况下提供默认值,则它是: 涉及不必要地复制代码,或 这不需要是常数。 Scala的Option monad(与Swift的Optional基本相同)具有用于此目的的方法: 我想念什么吗?Swift已经有一种紧凑的方式做到这一点吗?否则,是否可以在扩展名中为Optional 定义? 问题答案: 更新资料 苹果现在

  • 为我在原始问题中提出的错误代码示例道歉。我试图把我的问题简单化,但结果却相当令人困惑。 我稍微修改了一下代码: 我得到了第一个错误: 所以我把最后一行改为: 然后在Orelse上弹出一个新的错误: Optional>类型中的方法orElse(Capture#4-of?extends Map.Entry)不适用于参数(AbstractMap.SimpleEntry) 我最初的问题是,我不知道如何为这

  • 我使用的是Json。net将对象序列化到数据库。 我向类中添加了一个新属性(该属性在数据库的json中缺失),我希望新属性在json中缺失时具有默认值。 我尝试了DefaultValue属性,但它不起作用。我正在使用私有setter和构造函数来反序列化json,因此在构造函数中设置属性的值将不起作用,因为有一个带有该值的参数。 以下是一个例子: 我预计年龄是5岁,但现在是零岁。 有什么建议吗?

  • 我正在用TypeScript设置一个web应用程序,我似乎缺少了一些我需要的基本类型。 编译()时,会出现以下错误, 错误TS2304:找不到名称“TouchEvent”。 错误TS2304:找不到名称“MouseEvent”。 错误TS2304:找不到名称“PointerEvent”。

  • 我有一个Spring启动应用程序,它定义了: 写入kafka主题的REST控制器,STREAM_TOPIC_IN_QQQ 一个从STREAM_TOPIC_IN_QQQ(group pId="bar")和日志读取的KafkaListener 查看主题并记录的KStream,将其转换为另一种类型,然后将其写入STREAM_TOPIC_OUT_QQQ 另一个从STREAM_TOPIC_OUT_QQQ读取

  • 我有以下定义: 伊鲁特: IRoutesConfig: 以及我的路由配置,然后将其传递给类以进一步增强 我正在测试登录功能组件: 这是一个新的项目设置,还没有为登录道具定义任何内容。因此,它当前为空,稍后将进行扩展,内容也是如此,因为我们目前正在设置routes体系结构。 VSCode在中的"组件"上给了我以下提示: 我当然不是声明类型、道具和钥匙。 最后,路由配置将被提供给RouteManage