Typescript中的字符串或数字值

时间:2016-09-13 10:24:41

标签: javascript typescript

我想要实现的一个例子:

class Test {
    private _folderId: number;
    private _pageId: number;
    private _folderName: string;
    private _pageName: string;

    constructor(pageId: string | number, folderId: string | number){
        this._folderId = (!isNaN(+folderId)) ? folderId : undefined;
        this._pageId = (!isNaN(+pageId)) ? pageId : undefined;
        this._folderName = (isNaN(+folderId)) ? folderId : undefined;
        this._pageName = (isNaN(+pageId)) ? pageId : undefined;
    }
}

不幸的是,这会抛出编译器错误:

TS2322:Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'.

等等(每个var的类似错误)。

周围有什么办法吗?目前我唯一能做的就是设置页面和文件夹ID来输入任何...

3 个答案:

答案 0 :(得分:3)

您应该使用类型操作符,如

typeof folderId === "number"

检查数字或字符串。

答案 1 :(得分:3)

根据Guenter Guckelsberger的回答,评论建议您需要使用'123'之类的字符串作为数字。这是一个解决方案:

/**
* See http://stackoverflow.com/questions/9716468/is-there-any-function-like-isnumeric-in-javascript-to-validate-numbers
*/
function isNumeric(n: any) : n is number | string {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

function intVal(n: number | string): number {
    return typeof n === "number" ? n : parseInt(n, 10);
}

class Test {
    private _folderId: number;
    private _pageId: number;
    private _folderName: string;
    private _pageName: string;

    constructor(pageId: string | number, folderId: string | number) {
        if (isNumeric(folderId))
            this._folderId = intVal(folderId);
        else
            this._folderName = <string>folderId;
        if (isNumeric(pageId))
            this._pageId = intVal(pageId);
        else
            this._pageName = <string>pageId;
    }
}

答案 2 :(得分:3)

由于您已经提到了pageIdfolderId打字稿的模糊类型,因此无法确定您的变量在分配时是数字还是字符串。因此,您需要在分配时指定变量的确切类型。这可以使用类型转换来完成

您可以将folderIdpageId标记为数字或字符串,如下所示:

constructor(pageId: string | number, folderId: string | number){
    this._folderId = (!isNaN(+folderId)) ? folderId as number : undefined;
    this._pageId = (!isNaN(+pageId)) ? pageId as number : undefined;
    this._folderName = (isNaN(+folderId)) ? folderId as string : undefined;
    this._pageName = (isNaN(+pageId)) ? pageId as string: undefined;
}

另一种类型转换方式是<number>folderId <string>folderId。 您也可以按照&#39; Paleo的回答

中的type Guards进行操作