【发布时间】:2016-08-01 19:46:45
【问题描述】:
我有一个类BigNumber,它的构造函数接受一个初始化参数,该参数可以是字符串、数字或BigNumber。构造函数将使用给定参数类型的适当策略初始化BigNumber 的实例:
export class BigNumber
{
private static isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
public d : number[];
public e : number;
public s : number;
constructor(v : string | number | BigNumber)
{
let e, i, t,
x = this;
if (v instanceof BigNumber)
{
// code dependent of v being a BigNumber
x.s = v.s;
x.e = v.e;
x.d = v.d.slice();
return;
}
else if (typeof v === 'number')
{
// code dependent of v being a number
if (v === 0)
{
x.s = (1 / v < 0) ? -1 : 1;
x.e = 0;
x.d = [0];
return;
}
// Other stuff
}
else if(typeof v === 'string')
{
// code dependent of v being a string
if (v.charCodeAt(0) === 45)
{
v = v.slice(1);
x.s = -1;
}
else
{
x.s = 1;
}
// Other stuff
}
else
{
// throw error
}
}
}
问题是打字稿在字符串部分引发了很多与赋值或调用函数(如slice())相关的错误,即类型保护不起作用。
这些可以通过对每个操作的显式强制转换来修复,但是我的印象是打字稿编译器能够推断出 instanceOf 或 typeof 块中的类型。我哪里出错了?
【问题讨论】:
-
您的代码没有错误,即使当我添加
console.log(v.slice(0, 3))时它是一个字符串,我也没有错误。请提供导致错误的代码。 -
@NitzanTomer 添加了一些额外的代码,现在它给出了我提到的一些错误。
标签: typescript