类型化数组到 TypeScript 中的文字类型
Typed Array to literal Type in TypeScript
如何根据实际值将 typed 字符串数组用作 literal 类型的并集?在高层次上,我有一个像 ['hello', 'world']
这样的类型化数组,我想从中推断出一种新类型的 'hello' | 'world'
.
const someArray: Readonly<Array<string>> = ['hello', 'world'] as const;
type SomeType = typeof someArray[number]; // string
SomeType
现在将被推断为 string
而不是并集。我如何推断文字类型的并集?
这个问题与 非常相似,区别在于数组是 typed。我无法删除它。下面的代码可以工作,但 someArray
实际上键入为 Array<string>
.
const someArray = ['hello', 'world'] as const;
type SomeType = typeof someArray[number]; // 'hello' | 'world'
有没有办法相应地缩小推断类型?
edit:这个例子明显被简化了。我使用需要一组对象的第三方库。这些是由第三方键入的,我无法在不失去类型支持的情况下更改它。我意识到它可以在没有类型的情况下工作,但实际上我无法删除它。
您无法让 TypeScript 推断出与明确告知的内容直接矛盾的内容 (Readonly<Array<string>>
)。该类型注释赢得了胜利。
正如您所指出的那样,解决方法是删除类型注释。但是你说过你不能那样做。
由于您无法删除类型注释——例如,数组由您无法控制的代码定义——那么您别无选择,只能复制列表类型中的可能值,当原始文件发生变化并且您不更新副本时,这会使您面临维护问题。为了缓解这种情况,您可以添加运行时检查来处理原始文件已更改的情况,因此它们不再匹配:
const duplicatedArray = ['hello', 'world'] as const;
type SomeType = typeof duplicatedArray[number]; // 'hello' | 'world'
if ( someArray.length !== duplicatedArray.length ||
someArray.some((e, i) => e !== duplicatedArray[i])) {
throw new Error(`'someArray' and 'duplicatedArray' no longer match`);
}
(其中的运行时部分可能在自动化测试中而不是主代码中。)
非常很多第二或第三好的解决方案,但如果你别无选择,它至少是一些东西。
如何根据实际值将 typed 字符串数组用作 literal 类型的并集?在高层次上,我有一个像 ['hello', 'world']
这样的类型化数组,我想从中推断出一种新类型的 'hello' | 'world'
.
const someArray: Readonly<Array<string>> = ['hello', 'world'] as const;
type SomeType = typeof someArray[number]; // string
SomeType
现在将被推断为 string
而不是并集。我如何推断文字类型的并集?
这个问题与 someArray
实际上键入为 Array<string>
.
const someArray = ['hello', 'world'] as const;
type SomeType = typeof someArray[number]; // 'hello' | 'world'
有没有办法相应地缩小推断类型?
edit:这个例子明显被简化了。我使用需要一组对象的第三方库。这些是由第三方键入的,我无法在不失去类型支持的情况下更改它。我意识到它可以在没有类型的情况下工作,但实际上我无法删除它。
您无法让 TypeScript 推断出与明确告知的内容直接矛盾的内容 (Readonly<Array<string>>
)。该类型注释赢得了胜利。
正如您所指出的那样,解决方法是删除类型注释。但是你说过你不能那样做。
由于您无法删除类型注释——例如,数组由您无法控制的代码定义——那么您别无选择,只能复制列表类型中的可能值,当原始文件发生变化并且您不更新副本时,这会使您面临维护问题。为了缓解这种情况,您可以添加运行时检查来处理原始文件已更改的情况,因此它们不再匹配:
const duplicatedArray = ['hello', 'world'] as const;
type SomeType = typeof duplicatedArray[number]; // 'hello' | 'world'
if ( someArray.length !== duplicatedArray.length ||
someArray.some((e, i) => e !== duplicatedArray[i])) {
throw new Error(`'someArray' and 'duplicatedArray' no longer match`);
}
(其中的运行时部分可能在自动化测试中而不是主代码中。)
非常很多第二或第三好的解决方案,但如果你别无选择,它至少是一些东西。