为什么我可以使用 `as` 但不能为打字稿中的映射值分配类型?

问题描述 投票:0回答:1

我有一个对象列表,它们是用

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);

typescript types casting
1个回答
0
投票

他们做的不是同一件事。

as
更强大,并且会覆盖它对类型的了解。它是一个强制转换,可用于坚持认为对象属于特定类型,即使其当前类型不一致。

对于诸如

const patterns: [string, ...string[]]
之类的类型声明来说,情况并非如此,其值必须在编译时已知才能分配才能使用。

© www.soinside.com 2019 - 2024. All rights reserved.