【问题标题】:Typescript: force key and value to be of the same type?打字稿:强制键和值属于同一类型?
【发布时间】:2021-11-23 06:21:22
【问题描述】:

我正在尝试创建一个类型来表达以下约束:

// Valid
{
  "foo": "foo"
}

// Valid
{
  "bar": "bar"
}

// Not valid
{
  "foo": "bar"
}

我认为我应该能够使用映射类型来做到这一点:

type KeyValueSameDict = {
  [key in string]: key
};

但是,这只是推断类型Record<string, string>。如果我提前知道钥匙,我也认为我可以做到这一点:

type KeyValueSameDictKeys = "foo" | "bar";

type KeyValueSameDict = {
  [v in KeyValueSameDictKeys]?: v;
};

但是,我想要一种不必这样做的方法。

我正在尝试做的事情可能吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    啊,如果我们将推理拆分为恒等函数,我们就可以做到这一点:

    type KeyValueSameDict<Keys extends string> = {
      [v in Keys]?: v;
    };
    
    function inferGeneric<T extends string>(t: KeyValueSameDict<T>) {
      return t;
    }
    
    const foo = inferGeneric({ foo: 'foo', bar: 'bar' } as const);
    

    【讨论】:

    • 我认为这比我的回答要好。它适用于具有多个键的对象
    • 在@Tomas Reimers 问题中创建键/值对不是可选的。
    • @sno2 抱歉,如果我不清楚 - 你的意思是它不可能是可选的?
    猜你喜欢
    • 2017-05-16
    • 2023-02-06
    • 2021-10-12
    • 2020-03-09
    • 2015-11-06
    • 2021-06-24
    • 2020-04-09
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多