我想指定一个 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>
这种宽泛的定义?
1
anjianshi 2022-07-19 15:17:14 +08:00
const obj = { x1: 'a', x2: 'b', x3: 'c' } as const
就行了? |
2
TWorldIsNButThis OP @anjianshi 但是这个不能阻止 x4: 'd' 这个不合法的值
|
3
noe132 2022-07-19 15:28:55 +08:00
type Keys = 'xxx1' | 'xxx2' | 'xxx3'
type Obj = Record<Keys, ValidValue> |
4
TWorldIsNButThis OP @noe132 这个拿到的类型就不是 const 的了,typeof obj['xxx1']不是 'a' 而是 'a' | 'b' | 'c',
|
5
aguesuka 2022-07-19 17:49:22 +08:00 2
type ValidValue = 'a' | 'b' | 'c'
const obj = (<T extends Record<any, ValidValue>>(_ : T): T => _)({ xxx1: 'a', xxx2: 'b', xxx3: 'c', }) |
6
TWorldIsNButThis OP @aguesuka 卧槽 牛逼👍 这是啥原理, 立即执行函数吗
|
7
aguesuka 2022-07-19 18:15:33 +08:00
@TWorldIsNButThis 定义一个返回参数的 lambda 然后执行它.
|