是否有可能在打字稿中知道数组的预期成员类型?

时间:2017-05-14 10:17:46

标签: typescript

我想知道打字数组的预期类型:

let A1:string[] = [],
    A2:Date[] = [],
    expectedType = (arr:any[]) => {
       console.log("Expecting: " + /*some magic*/);
    };

expectedType(A1); // prints string
expectedType(A2); // prints Date

UPD: 正如在答案中所述,目前在TS中不可能知道Array memebers decalder类型,但是你可以做类似的事情:

    class StrictArray extends Array {
        private _expectedType: {new(): T}; // constructor type definition
        get expectedType():{new(): T} {return this._expectedType;};
        constructor(ctype: {new(): T}, args?:any) {
             super.constructor(args);
        }

//...
        push(t:any) {
            if (!(t.constructor !== this._expectedType))
                throw "Not valid type";
            return super.push(t);
        }
    }

现在我们的对象行为像普通数组一样,但我们将能够检索和控制其成员类型。

所以我们的例子是:

let A1:StrictArray = new StrictArray(string),
    A2:StrictArray = new StrictArray(Date);

    /*magic = */
    A1.expectedType.name; // prints string
    A2.expectedType.name; // prints Date

不确定这是如何有用或有害的,请发表评论。

1 个答案:

答案 0 :(得分:0)

  

是否可以在typescript中知道数组的预期成员类型?

没有。在编译到JS之前删除类型信息,这样您就可以获得JS所拥有的内容。你可以做JS风格的内省,例如typeof arr[0] === 'string'但JavaScript非常有限。