首页 > 解决方案 > 如何在 TypeScript 中限制为只有 2 个数字索引签名类

问题描述

谷歌搜索了一段时间后,我找不到适合我的正确答案。

我想声明一个类,它有一个只允许01数字键的数字索引。

这是我到目前为止所拥有的:

class TupleWrapperClass{
   [values:number]

   constructor(value1: number, value2: number) {
       this[0] = value1;
       this[1] = value2;
   }
}

这个想法是这个类表示一个数字元组[number,number],并且只能存储 2 个数字。我遇到的问题是它允许添加超过 2 个元素:

let t = new TupleWrapperClass(0,3);
console.log(t[0]); // Output: 0
console.log(t[1]); // Output: 3
console.log(t[2]); // Output: undefined
t[2] = 7
console.log(t[2]); // Output: 7

我已经阅读了一些他们定义类型和索引器的答案,这似乎有效

type Index = 0 | 1
type TupleWrapperType = { [k in Index]?: number }

但是,我无法进行类型检查:

let t: TuppleWrapperType = { 0: 2, 1: 5 };
if(typeof t === TuppleWrapperType){} // Fails.

我已经阅读了很多关于自定义类型以及为什么我们不能在运行时检查它们的类型的内容,这就是我转而创建自定义类的原因,因为这让我可以进行类型检查:

let t = new TupleWrapperClass(0,3);
if(t instanceof TuppleWrapperClass){} // All good

如何将我的 TupleWrapperClass 限制为仅 2 个索引?

标签: typescript

解决方案


这个怎么样,在实例化之前在类中声明类型

class TupleWrapperClass{
   0: number;
   1: number;
   constructor(value1: number, value2: number) {
       this[0] = value1;
       this[1] = value2;
   }
}

let t = new TupleWrapperClass(0,3);

console.log(t[0]); // OK
console.log(t[1]); // OK
console.log(t[2]); // Type Error

推荐阅读