请查看以下TypeScript代码。 显然,类型推断的行为类似于注释中所述。
现在是一个问题:是否可以以某种方式更改type V2 = ...
的定义,使其推断键入"someOtherValue"
而不是一般不再string
?>
据我了解TypeScript的类型推断,这绝对不可能...但是谁知道,也许我错了。 为了安全起见,我最好向TypeScript社区寻求帮助。谢谢。
const config1 = { value: 'someValue' as const }
type K1 = keyof typeof config1 // type K1: "value" (not string in general)
type V1 = (typeof config1)['value'] // type V1: "someValue" (not string in general)
const config2 = { value: 'someOtherValue' }
type K2 = keyof typeof config2 // type K2: "value" (not string in general)
type V2 = (typeof config2)['value'] // type V2: string
TypeScript游乐场:Demo
答案 0 :(得分:2)
您还需要在整个const
上投放config2
。
const config2 = { value: 'someOtherValue' } as const;
否则它将始终是字符串。
具有密钥访问权限
const config1 = { value: 'someValue' as const }
type K1 = keyof typeof config1 // type K1: "value" (not string in general)
type V1 = (typeof config1)['value'] // type V1: "someValue" (not string in general)
const config2 = { value: 'someOtherValue' } as const;
type K2 = keyof typeof config2 // type K2: "value" (not string in general)
type V2 = (typeof config2)[K2] // type V2: "someOtherValue"
答案 1 :(得分:1)
现在的问题是:是否可以通过某种方式更改 在某种程度上,类型V2 = ...推断为类型“ someOtherValue”,并且 不再再打弦了?
Yes, you have to tell typescript that type is not going to change with const assertion。您可以按照@satanTime建议,将其应用于值prop或整个对象。
为什么?因为打字稿假设您可能会做以下事情。
const config2 = { value: 'someOtherValue' }
config2.value = "something different"
应用了const断言后,类型检查器可以决定进行类型缩小。
const config1 = { value: 'someValue' as const }
config1.value = "test" // Type '"test"' is not assignable to type '"someValue"'.
const config2 = { value: 'someOtherValue' } as const
config2.value = "test" // Cannot assign to 'value' because it is a read-only property.