Javascript Typescript中的字符串或数字值

Javascript Typescript中的字符串或数字值,javascript,typescript,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 = (!is

我正在努力实现的一个例子:

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设置为键入any…

您应该像这样使用typeof操作符

typeof folderId === "number"

检查数字或字符串。

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;
    }
}
/**
*看http://stackoverflow.com/questions/9716468/is-there-any-function-like-isnumeric-in-javascript-to-validate-numbers
*/
函数isNumeric(n:any):n是数字|字符串{
return!isNaN(parseFloat(n))和&isFinite(n);
}
函数intVal(n:number | string):number{
返回类型n==“number”?n:parseInt(n,10);
}
课堂测试{
private\u folderId:编号;
private _pageId:编号;
private\u folderName:string;
private_pageName:string;
构造函数(pageId:string | number,folderId:string | number){
if(isNumeric(folderId))
这._folderId=intVal(folderId);
其他的
这是。_folderName=folderId;
if(isNumeric(pageId))
这是._pageId=intVal(pageId);
其他的
这。_pageName=pageId;
}
}

因为您提到了
pageId
folderId
类型的不明确类型,所以脚本在赋值时无法判断变量是数字还是字符串。因此,您需要在赋值时指定变量的确切类型。这可以使用类型转换来完成

您可以将
folderId
pageId
键入数字或字符串,如下所示:

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;
}
另一种打字方式是
folderId
folderId

您还可以按照“Paleo的答案”中所示进行搜索,您需要定义如下
private _pageId:string | number并强制转换value@iberbeu但那会破坏逻辑,不是吗?我不希望pageId是
string | number
,我只希望它是
number
,然后您需要以某种方式将它转换为一个数字。如果您可以接受一个
字符串|数字
,您可以希望
parseInt
字符串值(您需要在运行时检查类型或
.toString()
),或者您实际上不想接受
字符串|数字
。用类型保护替换
isNaN
。那是个坏主意<对于空字符串值,code>parseInt
将返回
NaN
,TypeScript在编译时不知道
parseInt
是否返回
NaN
。需要进行运行时检查。一个类型守卫在这方面不会有帮助(事实上,它会让事情变得更糟)看不到你的观点:typeof“123”==“number”是假的,而typeof 123==“number”是真的。确切地说,
“123”
123
都应该作为数字计算这正是我想要的,很抱歉我接受了Paleo的答案,只是因为我认为,
var
对于其他开发人员来说更为明显。谢谢和你一样,我也开始打字(使用打字保护),但这不正确。在您的解决方案中,像
'123'
这样的字符串值将存储在
number
类型的变量中。Yes var确实更有意义。但是,如果您在
.jsx
文件中进行编码,那么如果您使用var,编辑器会抱怨,这就是
var as type
的作用handy@Paleo如果你试图将字符串赋值为number类型的变量,typescript编译器抱怨出现如下错误:
类型编号和类型字符串都不能相互分配
@nahushfarkand使用
('123','456')
调用构造函数<代码>!isNaN(+'123')返回
true
。然后字符串值
'123'
被分配给变量
this.\u folderId
类型
数字