在 TypeScript 中扩展 Number.prototype
How to Extend Number.prototype in TypeScript
在 TypeScript 中扩展 Number.prototype:
- 创建一个
number.extensions.ts
文件。 - 扩展
Number
接口,添加扩展方法。 import './number.extensions'
像使用之前一样导入扩展方法。
以下是内容number.extensions.ts
:
号码.extensions.ts
interface Number { sum(a: number): number; } Number.prototype.sum = function (a: number) { return Number(this) + a; };
下面是我们如何在原型上导入和使用新sum
方法:Number
索引.ts
import './number.extensions'; const num = 100; console.log(num.sum(5000)); // 👉️ 5100
如果我运行我的index.ts
文件,我们可以看到该sum
方法被成功调用。
我们声明了一个新接口
Number
,它将与原始Number
接口合并。在界面中,我们创建了一个sum
方法,将 2 个数字相加并返回结果。
确保在扩展原型时使用命名函数,而不是箭头函数,因为箭头函数使用
this
封闭范围的 ,这不是您想要的。您可以使用这种方法来扩展Number.prototype
任何方法。以下是将前导零添加到数字的方法示例。
这是number.extensions.ts
文件中的代码:
号码.extensions.ts
interface Number { addLeadingZeros(): string; } Number.prototype.addLeadingZeros = function () { return padToDigits(Number(this), 5); }; function padToDigits(num: number, totalLength: number) { return num.toString().padStart(totalLength, '0'); }
这是index.ts
导入number.extensions
并使用该addLeadingZeros
方法的文件。
索引.ts
import './number.extensions'; const num = 100; // 👇️ "00100" console.log(num.addLeadingZeros());
确保在导入number.extensions.ts
模块时指定正确的路径。
覆盖时
Number.prototype
,请确保您的方法不会干扰内置方法名称,除非有意覆盖它们(这可能会造成混淆)。原来的Number
界面是这样的:
索引.ts
interface Number { toString(radix?: number): string; toFixed(fractionDigits?: number): string; toExponential(fractionDigits?: number): string; toPrecision(precision?: number): string; valueOf(): number; }
下面是一个如何覆盖内置toString()
方法的示例。
号码.extensions.ts
interface Number { toString(): string; } Number.prototype.toString = function () { return 'hello world'; };
这是我们index.ts
文件中的代码。
索引.ts
import './number.extensions'; const num = 100; // 👇️ "hello world" console.log(num.toString());
请注意,覆盖内置方法会造成混淆,通常应避免使用。