【问题标题】:Use type from index in child types在子类型中使用索引中的类型
【发布时间】:2020-05-03 23:02:44
【问题描述】:

我有一堆内置在对象文字中的数据。这个对象的键也存在于这个对象的每个子对象中,我想用打字稿来强制执行:

type People = {[NAME in string]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // no error, name evaluates to string
    Sally: { name: "Sally", age: 35 },
};

过去我使用字符串联合做过类似的事情:

type People = {[NAME in "Jeff" | "Fred" | "Sally"]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // ERROR: Type '"Freddy"' is not assignable to type '"Fred"'.  ts(2322)
    Sally: { name: "Sally", age: 35 },
};

但是对于我当前的用例来说,除了对象之外维护一个单独的联合类型是多余的。

是否可以在该对象的子对象中使用索引对象的键类型?

【问题讨论】:

  • 您当前的用例是什么?我不知道这是否可行,但如果不可行,我也不会太惊讶——这样复制感觉就像糟糕的设计。
  • @gqstav 我正在尝试将类型添加到 JSON 中定义的现有模式格式中。它使用匹配的键和typename 属性在一个平面对象中定义其所有类型。

标签: typescript


【解决方案1】:

我能做的最好是这样:

type People<T> = { [K in keyof T]: { name: K; age: number } };

function createPeople<T extends People<T>>(people: T): People<T> {
    return people;
}

const people = createPeople({
    Jeff: { name: 'Jeff', age: 30 },
    Fred: { name: 'Freddy', age: 25 }, // ERROR: Type '"Freddy"' is not assignable to type '"Fred"'.  ts(2322)
    Sally: { name: 'Sally', age: 35 },
});

【讨论】:

  • 不适用于我的用例,但我真的认为这已经接近我将要得到的 - 谢谢!
猜你喜欢
  • 2021-12-30
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2011-01-28
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多