Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用枚举索引对小元组进行索引会不正确地触发TS2493_Typescript_Tslint_Deno - Fatal编程技术网

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

Typescript 使用枚举索引对小元组进行索引会不正确地触发TS2493,typescript,tslint,deno,Typescript,Tslint,Deno,下面的代码是我要做的事情的要点 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];

下面的代码是我要做的事情的要点

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相信它不需要担心这个问题吗?

可以帮上忙

enum Foo{
Foo0,Foo1,Foo2,Foo3,Foo4//更多
}
功能栏(foo:foo){
const baz:[any,any]=[0,0];
//只有Foo0和Foo1可以有效地传递到bar
如果(!checkIsFoo0OrFoo1(foo))抛出RangeError();
返回baz[foo];
}
函数checkIsFoo0OrFoo1(foo:foo):foo是(foo.Foo0 | foo.Foo1){
返回foo>2;
}

因为
enum
键可以与任何值相关联,即它们不必是升序数或从一个特定的数字开始,而且编译器不提供具体的值,因此似乎无法干净地处理此问题

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


一般来说,您不应为此目的使用
Enum

只需对
foo
参数使用
0 | 1
索引联合类型即可

类型Foo=0 | 1
功能栏(foo:foo){
const baz:[any,any]=[0,0];
返回baz[foo];
}

顺便说一句,有一个“一关一关”错误。条件应该是
foo>1
,因为枚举从0开始,除非指定了不同的值,并且示例中没有该值。@H.B.off by 1只是从提取此问题的实际代码中输入的一个输入错误。不过接得不错!Foo枚举的含义比这里指出的要多,它只是针对这个问题提炼出来的。我知道这通常不是一个好的做法,但我保证有充分的理由使用它,而不仅仅是0 | 1 |等。
function bar(foo: Foo) {
    const baz: [any, any] = [0,0];

    const index = foo as number;
    if (index > 1) throw RangeError(); // if enum is 0-based (default)
        return baz[index];
}