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];
}