TypeScript:使用字符串文字时的类型推断

时间:2020-05-10 12:17:20

标签: typescript typescript-typings

请查看以下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

2 个答案:

答案 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.