一个类型体操的问题,我能不能既要又要?

2022-07-19 15:09:47 +08:00
 TWorldIsNButThis

我想指定一个 object 的 value 限定为某几个 string literal 其中之一,key 不限制,但是最终得到的类型是 const 的 比如

type ValidValue = 'a' | 'b' | 'c'

const obj = {
  xxx1: 'a',
  xxx2: 'b',
  xxx3: 'c',
  xxx4: 'd' // 报错
}

并且这个 obj 最后推导出来的类型为 { xxx1: 'a', xxx2: 'b', xxx3: 'c' } 而不是 Record<string, ValidValue> 这种宽泛的定义?

1730 次点击
所在节点    TypeScript
7 条回复
anjianshi
2022-07-19 15:17:14 +08:00
const obj = { x1: 'a', x2: 'b', x3: 'c' } as const
就行了?
TWorldIsNButThis
2022-07-19 15:24:14 +08:00
@anjianshi 但是这个不能阻止 x4: 'd' 这个不合法的值
noe132
2022-07-19 15:28:55 +08:00
type Keys = 'xxx1' | 'xxx2' | 'xxx3'
type Obj = Record<Keys, ValidValue>
TWorldIsNButThis
2022-07-19 15:43:33 +08:00
@noe132 这个拿到的类型就不是 const 的了,typeof obj['xxx1']不是 'a' 而是 'a' | 'b' | 'c',
aguesuka
2022-07-19 17:49:22 +08:00
type ValidValue = 'a' | 'b' | 'c'
const obj = (<T extends Record<any, ValidValue>>(_ : T): T => _)({
xxx1: 'a',
xxx2: 'b',
xxx3: 'c',
})
TWorldIsNButThis
2022-07-19 18:13:20 +08:00
@aguesuka 卧槽 牛逼👍 这是啥原理, 立即执行函数吗
aguesuka
2022-07-19 18:15:33 +08:00
@TWorldIsNButThis 定义一个返回参数的 lambda 然后执行它.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX