微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用枚举索引对小元组进行索引会不正确地触发 TS2493

如何解决使用枚举索引对小元组进行索引会不正确地触发 TS2493

以下代码是我想要做的事情的要点

enum Foo {
    Foo0,Foo1,Foo2,Foo3,Foo4 // many more
}

function bar(foo: Foo) {
    const baz: [any,any] = [0,0];

    // Only Foo0 and Foo1 are valid to pass to bar
    if(foo > 2) throw RangeError();
    return baz[foo];
    // ^ Linter gives the following,even though foo can't be greater than 2:
    // TS2493 [ERROR]: Tuple type '[any,any]' of length '2' has no element at index '2'.
    // TS2493 [ERROR]: Tuple type '[any,any]' of length '2' has no element at index '3'.
    // TS2493 [ERROR]: Tuple type '[any,any]' of length '2' has no element at index '4'.
}

由于检查 foo 的值的行,baz[foo] 永远不会大于 2。有什么方法可以让 Typescript 相信它不需要担心这个?

>

解决方法

因为 website.com/category3/ 键可以与任何值关联,即它们不必是升序数字或从一个特定数字开始,而且编译器没有提供具体值,所以似乎没有办法干净利落地处理这个。

我建议断言 foo 是一个数字并使用它(尽管这仍然存在错误的可能性):

enum
,

type predicate 可以提供帮助

enum Foo {
    Foo0,Foo1,Foo2,Foo3,Foo4 // many more
}

function bar(foo: Foo) {
    const baz: [any,any] = [0,0];

    // Only Foo0 and Foo1 are valid to pass to bar
    if(!checkIsFoo0OrFoo1(foo)) throw RangeError();
    return baz[foo];
}

function checkIsFoo0OrFoo1(foo: Foo): foo is (Foo.Foo0 | Foo.Foo1) {
  return foo > 2;
}
,

一般来说,您不应将 function bar(foo: Foo) { const baz: [any,0]; const index = foo as number; if (index > 1) throw RangeError(); // if enum is 0-based (default) return baz[index]; } 用于此类目的。

只需将 Enum 索引联合类型用于 0|1 参数

foo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。