TypeScript 如何知道自定义数组类型中长度字段的行为?

Posted

技术标签:

【中文标题】TypeScript 如何知道自定义数组类型中长度字段的行为?【英文标题】:How does TypeScript know about the behaviour of the length field in custom array types? 【发布时间】:2017-03-11 10:21:05 【问题描述】:

当您使用接口创建自定义数组类型并为其提供字段length: number 时,TypeScript 似乎以某种方式自行计算数组的长度,但如果您将字段排除在自定义类型定义之外,它不再有效。

这里到底发生了什么?

我的代码是:

interface IPerson 
    fullName: string;
    age: number;


class Person implements IPerson 
    fullName: string;
    age: number;

    constructor(fullName: string, age: number) 
        this.fullName = fullName;
        this.age = age;
    


interface IPersonArray 
    [index: number]: IPerson;
    length: number;


var personArray: IPersonArray = [new Person("Jane", 21),
                                new Person("John", 22)];

for (var i = 0; i < personArray.length; i++) 
    console.log(personArray[i].fullName);

这是最相关的部分:

interface IPersonArray 
    [index: number]: IPerson;
    length: number;


var personArray: IPersonArray = [new Person("Jane", 21),
                                new Person("John", 22)];

for (var i = 0; i < personArray.length; i++) 
    console.log(personArray[i].fullName);

我只是在界面中声明了length 字段,但是 TypeScript 神奇地找出了长度字段应该如何工作,并且我得到了预期的输出。这是怎么发生的?

【问题讨论】:

【参考方案1】:

这并不像看起来那么神奇。

您自己在接口IPersonArray 中添加该字段的定义,然后将数组分配给personArray。 TypeScript 知道一个数组有一个length 属性,所以赋值没问题。并在运行时调用数组的长度属性。

如果您将length 从您的接口/类型中排除,您将无法访问它,就像您无法访问您碰巧分配给personArray 的数组的任何其他属性一样。

【讨论】:

谢谢!不过,我没有足够的代表来支持你,对不起:(【参考方案2】:

在打字稿中,接口只是编译时使用的契约。

如果你要编译一个只包含接口的文件,你会得到一个空的(或几乎是空的)文件。

您的代码正在做的是:定义一个名为IPersonArray 的接口,这意味着 - 每个实现这个接口的类至少应该实现length[]。 - 如果将此接口用作 var 类型,则您的 var 只能访问 length[],并且分配给此 var 的值应该具有兼容的类型(any 除外)。

JS 的原生数组(Typescript 可识别)具有 length[],因此您可以将其分配给 IPersonArray 类型的 var。

但是...您也可以有一个通过编译但在运行时完全错误的代码:

let anyType: any =  notLenght: ":scream:" ;
let typedArray: IPersonArray = anyType;

let count: number = typedArray.length; // `undefined`, since there is `length` in `anyType`

顺便说一句:

一个。你可以对数组使用泛型:Array&lt;Person&gt; 相当于你的接口IPersonArray

b.您可以使用for of 来迭代 Typescript 中的数组(取决于您使用的版本)

for (let person of personArray) 
  console.log(person.fullName);

【讨论】:

我刚开始学习 TypeScript,还没有接触到泛型。感谢您花时间写出如此深入的答案,它确实为我清除了很多东西!

以上是关于TypeScript 如何知道自定义数组类型中长度字段的行为?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中创建自定义类型

c语言中如何自定义数组长度

如何自定义一个长度可变数组

如何使用 Typescript 使用自定义方法实现类数组类?

如何让 TypeScript 知道自定义 Jest 匹配器?

c语言中如何自定义数组长度