需要先声明该成员才可以实现
interface Array<T> {
toUpperCase(this: string[]): string[];
}
实现大致如下所示
if (typeof Array.prototype.toUpperCase !== 'function') {
Array.prototype.toUpperCase = function () {
return this.map(c => c.toUpperCase());
};
}
请注意,对现有成员的检查有点草率。仅仅因为它是一个函数并不意味着它具有与我们原本放置在那里的相同的行为。通常应该避免增强内置原型,但有时它是有用的。切勿在库中执行此操作,并警告您的代码可能会在未来的某些环境中崩溃。
运行示例 https://fabiandev.io/typescript-playground/#JTdCJTIyZWRpdG9yJTIyJTNBJTIyaW50ZXJmYWNlJTIwQXJyYXklM0NUJTNFJTIwJTdCJTVDbiUyMCUyMCUyMCUyMHRvVXBwZXJDYXNlKHRoaXMlM0ElMjBzdHJpbmclNUIlNUQpJTNBJTIwc3RyaW5nJTVCJTVEJTNCJTVDbiU3RCU1Q24lNUNuaWYlMjAodHlwZW9mJTIwQXJyYXkucHJvdG90eXBlLnRvVXBwZXJDYXNlJTIwISUzRCUzRCUyMCdmdW5jdGlvbicpJTIwJTdCJTVDbiUyMCUyMCUyMCUyMEFycmF5LnByb3RvdHlwZS50b1VwcGVyQ2FzZSUyMCUzRCUyMGZ1bmN0aW9uJTIwKCklMjAlN0IlNUNuJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwdGhpcy5tYXAocyUyMCUzRCUzRSUyMHMudG9VcHBlckNhc2UoKSklM0IlNUNuJTIwJTIwJTIwJTIwJTdEJTNCJTVDbiU3RCU1Q24lNUNuJTVCMSUyQyUyMDIlMkMlMjAzJTVELnRvVXBwZXJDYXNlKCklM0IlNUNuJTVDbiU1QidhJTJDJyUyQyUyMCdiJyUyQyUyMCdjJyU1RC50b1VwcGVyQ2FzZSgpJTNCJTIyJTJDJTIyb3B0aW9ucyUyMiUzQSU3QiUyMmNvbXBpbGVyT3B0aW9ucyUyMiUzQSU3QiUyMm5vSW1wbGljaXRBbnklMjIlM0F0cnVlJTJDJTIyc3RyaWN0TnVsbENoZWNrcyUyMiUzQXRydWUlMkMlMjJub0ltcGxpY2l0UmV0dXJucyUyMiUzQXRydWUlMkMlMjJub0ltcGxpY2l0VGhpcyUyMiUzQXRydWUlMkMlMjJyZW1vdmVDb21tZW50cyUyMiUzQWZhbHNlJTJDJTIyZXhwZXJpbWVudGFsRGVjb3JhdG9ycyUyMiUzQWZhbHNlJTJDJTIyZW1pdERlY29yYXRvck1ldGFkYXRhJTIyJTNBZmFsc2UlMkMlMjJhbGxvd05vblRzRXh0ZW5zaW9ucyUyMiUzQXRydWUlMkMlMjJ0YXJnZXQlMjIlM0ElMjI0JTIyJTdEJTJDJTIyd2luZG93T3B0aW9ucyUyMiUzQSU3QiUyMmNvbnNvbGUlMjIlM0F0cnVlJTdEJTdEJTdE
我们可以看到,如果我们在错误类型的数组上调用此函数,TypeScript 将引发错误
[1, 2, 3].toUpperCase(); // Error
['a,', 'b', 'c'].toUpperCase(); // OK
请注意,如果您位于模块上下文中,则可以将声明部分包装在declare global
block.
把它放在一起:
// array-augmentations.ts
interface Array<T> {
toUpperCase(this: string[]): string[];
}
if (typeof Array.prototype.toUpperCase !==
'function') {
Array.prototype.toUpperCase = function () {
return this.map(c => c.toUpperCase());
};
}