我有一个对象列表,它们是用
as const
声明的,我想要一个仅包含对象值的新列表。我还需要对象中相同值的列表,但不想维护两个列表。
export const patternTypes = [
{ title: 'Starts with', value: 'startsWith' },
{ title: 'Contains', value: 'contains' },
{ title: 'Regular Expression', value: 'regex' },
] as const;
const patterns = patternTypes.map(item => item.value); // typed as string[]
由于我使用值列表(zod 枚举),我需要将类型转换为
[string, ...string[]]
。
我知道存在
string[]
与 [string, ...string[]]
不兼容的问题
我想知道为什么我可以在映射后使用
[string, ...string[]]
将值模式键入为 as
,但我无法将变量的类型声明为 const patterns: [string, ...string[]] = ...
。
我对
as
和类型声明的理解是它们实际上在做同样的事情。两者都需要与您要转换的类型兼容,这就是为什么有些解决方案是as any as <type I want>
来绕过兼容性的。
有人可以给我解释一下吗...
为什么我能做到这一点
const patterns = patternTypes.map(item => item.value) as [string, ...string[]];
但是我做不到
const patterns: [string, ...string[]] = patterns.map(item => item.value);
他们做的不是同一件事。
as
更强大,并且会覆盖它对类型的了解。它是一个强制转换,可用于坚持认为对象属于特定类型,即使其当前类型不一致。
对于诸如
const patterns: [string, ...string[]]
之类的类型声明来说,情况并非如此,其值必须在编译时已知才能分配才能使用。