模板文字在某些情况下会抛出错误,但在其他情况下不会

Template literal throws errors in some scenarios but not others

作为代码审查的一部分,一位同事建议使用类型而不是枚举。在进行更改时,我们发现了一个我们都没有预料到的问题。

我们预计场景一和场景二会抛出编译器 and/or 智能感知错误,因为其中一个值在类型中不存在。但是,经过测试,我们发现只有场景一会抛出错误,而场景二会毫无问题地解决。

这可能是一个理解问题,但从我读过的所有内容来看(例如 Template Literal Types 当提供的值不存在时,我们应该会收到错误。

基于以上,有谁能解释为什么我们只看到场景一的错误而场景二没有?

场景一

示例代码

export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg";

const allowedFileTypes = [".exe"] as Array<FileType>;

预期: 编译器错误,因为 .exe 不存在

结果: 编译器错误指出值不存在

场景二

示例代码

export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg";

const allowedFileTypes = [".exe", ".jpeg"] as Array<FileType>;

预期: 编译器错误,因为 .exe 不存在

结果:没有编译器错误

场景三

示例代码

export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg";

const allowedFileTypes = [".png", ".jpeg"] as Array<FileType>;

预期:没有编译器错误

结果:没有编译器错误

as Type 是一种说法“这个值 这种类型,即使它看起来不像它”。

您正在覆盖正常类型检测。

它对以下事情很有用:

const response = await fetch('/some/url');
const data = await response.json();
return data as Foo;

知道你从 HTTP 请求返回的数据的形状是什么,但编译器无法告诉你,除非你使用 as 明确地告诉它。


这很危险,因为您指定的类型您实际拥有的值(正如您发现的那样)不匹配。

我有一个正在进行的项目,我正在使用 superstruct 来测试我的数据在类型保护函数中的形状,而不是信任 as


您需要指定允许分配给变量的内容:

const allowedFileTypes: Array<FileType> = [".exe", ".jpeg"];