小墨の博客

梦想需要付诸行动,否则只能是梦

TypeScript 类型陷阱:元组(`as const` 数组)的 `includes` 方法类型检查

问题:ts includes 只能传入元组内的值

当使用 `as const` 将数组变为只读元组后,TypeScript 会对 `includes` 方法的参数进行严格类型检查:参数类型必须是元组内字面量类型的联合,否则会报错


示例


const a = ['1', '2'] as const;   // 类型为 readonly ['1', '2']
const b = ['1'] as const;        // 类型为 readonly ['1']

const str: '1' | '2' = '2';

a.includes(str); // ✅ 允许,因为 a 中包含 '1' 或 '2'
b.includes(str); // ❌ 类型“"2"”的参数不能赋给类型“"1"”的参数。ts-plugin(2345)


原因

- `as const` 将数组推断为只读元组,元素类型为字面量(如 `'1'`、`'2'`)。

- `includes` 方法的类型签名要求参数必须是元组元素类型的子集。

- 对于 `b`,元素类型是 `'1'`,因此 `includes` 只接受 `'1'` 类型。

- 变量 `str` 类型为 `'1' | '2'`(尽管运行时值是 `'2'`),类型检查时认为可能为 `'1'` 或 `'2'`,故拒绝调用。


解决方案

其中一种解决方案是:

b.includes(str as any);


另外,还可以自己写一个 includes 工具函数去处理,也有其他方案,这里就不再展开



参考:https://blog.csdn.net/gitblog_00585/article/details/151456391


张小弟之家

本文链接:
文章标题:

本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@only4.work

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    发表评论:

    搜索
    本文二维码
    标签列表
    站点信息
    • 文章总数:566
    • 页面总数:19
    • 分类总数:97
    • 标签总数:215
    • 评论总数:71
    • 浏览总数:505962

    | | |
    | |  Z-Blog PHP