【问题标题】:Typescript: Strong-typing (and autocomplete) for a value based on a sibling object's keys打字稿:基于兄弟对象键的值的强类型(和自动完成)
【发布时间】:2021-10-12 09:56:42
【问题描述】:

假设我有一个看起来像这样的对象:

const configuration: Config = {
  options: {
    'Option 1': 'some value here',
    'Option 2': 'some other value here'
  },
  defaultOption: 'Option 1'
}

我怎样才能写出Config这样的类型:

  • defaultOption 只能是 .options 对象中的键之一。 IE。 'Option 1''Option 2' 在上述情况下。
  • .options 可以有任意数量的键值对。
  • 用户不必预先指定.options 键。因此,用户不必指定const configuration: Config<'Option 1' | 'Option 2'> = ...。可以使用泛型,但用户不必指定它们。

【问题讨论】:

    标签: typescript type-inference strong-typing


    【解决方案1】:

    为了做到这一点并进行验证,您需要从函数参数推断您的配置对象:

    type Configuration<
      Options
      >
      = {
        options: Options,
        defaultOption: keyof Options
      }
    
    const config = <
      Options extends Record<string, string>,
      Config extends Configuration<Options>,
      Default extends keyof Config['options'],
      >(config: { options: Options, defaultOptions: Default }) => config
    
    const result = config({
      options: {
        'Option 1': 'some value here',
        'Option 2': 'some other value here'
      },
      defaultOptions: 'Option 1'
    }) // ok
    
    const result2 = config({
      options: {
        'Option 1': 'some value here',
        'Option 2': 'some other value here'
      },
      defaultOptions: 'invalid property'
    }) // error
    

    Playground

    【讨论】:

    • 不错的技巧,但是没有额外的函数调用还有其他选项吗?
    • 只有在您事先知道options 的情况下
    • 谢谢,@captain-yossarian。只是为了我的理解,将它包装在一个可以实现它的函数中是什么,这是你无法通过独立类型声明实现的?
    • @RakeshPai 是的,你是对的。因为如果你不知道可能options,TS就没有机会猜到了
    • @RakeshPai,有一个函数,TS 会推断泛型。使用独立声明,您需要自己添加它们,您说您不想添加。
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 2021-11-23
    • 2021-05-06
    • 2015-11-06
    • 1970-01-01
    • 2021-11-27
    • 2022-11-17
    • 2012-10-11
    相关资源
    最近更新 更多