繁体   English   中英

如何告诉 Typescript 两个对象键必须相同?

[英]How can I tell Typescript that two object keys must be the same?

我想在 JS/TS 记录上定义一个类型(即带有键和值的东西):

type Args<R extends object> = {
  foo: keyof R
  bar: keyof R
}

如何告诉 Typescript 我希望foobar相同keyof R

我可以做这个:

type Args<R extends object, K extends keyof R> = {
  foo: K
  bar: K
}

但是所有Args类型的客户端都必须手动指定类型K

type Pizza = {
  name:   string
  radius: int
}

const myArgs: Args<Pizza, 'name'> = { foo: 'name', bar: 'name' }

我认为打字稿应该能够推断出这一点。 但是我该如何写类型呢?

这个有可能。 您可以创建给定泛型类型的所有可能的foobar组合的联合,如下所示:

type Args<R extends object> = {
  [K in keyof R]: {
    foo: K,
    bar: K
  }
}[keyof R]

这将导致所需的行为:

type Pizza = {
  name:   string
  radius: number
}

const myArgs1: Args<Pizza> = { 
  foo: 'name', 
  bar: 'name' 
}
const myArgs2: Args<Pizza> = { 
  foo: 'name', 
  bar: 'radius' 
} // Error: "name"' is not assignable to type '"radius"

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM