模板文字在某些情况下会抛出错误,但在其他情况下不会
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"];
作为代码审查的一部分,一位同事建议使用类型而不是枚举。在进行更改时,我们发现了一个我们都没有预料到的问题。
我们预计场景一和场景二会抛出编译器 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"];