TypeScript如何为空数组定义元组类型?

时间:2018-06-21 11:43:17

标签: typescript

我要做的是将const对象转换为class,以便例如创建readonly属性。这样可以确保值永远不变。

在我的课堂上,我试图创建一个module属性,该属性应该定义,但始终为空。

我尝试了许多不同的事情:

public modules: Readonly<[]> = []; // Error: A tuple type element list cannot be empty.
public readonly modules: IModule[] = []; // Disallows re-assignment, but still allows things such as push, pop etc.

interface EmptyTuple {
  length: 0;
}

// Types of property 'length' are incompatible. Type 'number' is not assignable to type '0'.
public modules: Readonly<EmptyTuple> = [];

由于0是一个数字,所以最新的数字毫无意义。我真的不知道我在这里实际上在做什么,因此一些指导很完美。

我尝试查看https://github.com/Microsoft/TypeScript/issues/13126,以查看是否可以找到某种答案,但无济于事。

有人知道如何实现拥有无法修改的空数组吗?

3 个答案:

答案 0 :(得分:3)

  

有人知道如何实现拥有无法修改的空数组吗?

您可以将字段键入为ReadonlyArray,并用readonly关键字进行标记:

class Foo {
  readonly modules: ReadonlyArray<{}> = [];
}

const foo = new Foo();

foo.modules = []; //error
foo.modules.push({}) //error

答案 1 :(得分:0)

考虑到Typescript没用,您可以执行以下操作:

    public modules: = any[]; // Error: A tuple type element list cannot be empty.
    public readonly modules: = any[]; // Disallows re-assignment, but still allows things such as push, pop etc.

...

答案 2 :(得分:0)

TypeScript 3.0现在包括更好的元组类型支持:

type EmptyTuple = []

const empty: EmptyTuple = [] // OK

//  Type '[number]' is not assignable to type '[]'.
//    Types of property 'length' are incompatible.
//      Type '1' is not assignable to type '0'.
const err1: EmptyTuple = [1]

Source - TS 3.0 Announcement