iT邦幫忙

1

【js 轉 ts】增加 String.prototype 的正確作法

如題

String.prototype.format = function () {
  var txt = this.toString();
  for (var i = 0; i < arguments.length; i++) {
    var exp = getStringFormatPlaceHolderRegEx(i);
    arguments[i] = String(arguments[i]).replace(/\$/gm, '♒☯◈∭')
    txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i]));
    txt = txt.replace(/♒☯◈∭/gm, '$')
  }
  return cleanStringFormatResult(txt);
}
function getStringFormatPlaceHolderRegEx(placeHolderIndex: any) {
  return new RegExp('({)?\\{' + placeHolderIndex + '\\}(?!})', 'gm')
}
function cleanStringFormatResult(txt: string) {
  if (txt == null) return "";
  return txt.replace(getStringFormatPlaceHolderRegEx("\\d+"), "");
}

let b = '{0} {1}'.format('1', '2')

執行時會出現這個錯誤

1:18 - Property 'format' does not exist on type 'String'.

想請問要如何在ts 正確增加 String.prototype ?


目前已做過的嘗試
text.d.ts 新增

declare global {
    interface String {
        format(...t:string[]): string;
    }
}

但是 global 被嫌 "全域範圍的增強指定只能在外部模組宣告或環境模組宣告直接巢狀。"

老實說真的不太清楚 text.d.ts 要怎麼使用

2 個回答

2
listennn08
iT邦高手 8 級 ‧ 2020-07-08 15:51:39
最佳解答
interface String {
    format(...replacements: string[]): string;
}
if (!String.prototype.format) {
    String.prototype.format = function() {
        var args = arguments;
        return this.replace(/{(\d+)}/g, function(match, number) { 
            return typeof args[number] != 'undefined'
                ? args[number]
                : match;
        });
    };
}
let b = '{0} {1}'.format('1', '2')

ref

we684123 iT邦新手 5 級 ‧ 2020-07-08 16:30:32 檢舉

https://ithelp.ithome.com.tw/upload/images/20200708/20112304mDEKvl0CB6.png
謝謝你的解答,我之後會研究 interface 具體用法的

不過能請問一下為什麼會出現執行錯誤嗎?
是不是要把你上面的code打包成 lib.d.ts 再來 import 呢?

我沒有 jupyter 的環境
沒辦法跟你確認是什麼問題 因為我用 tsc 直接編譯
不然可以試試這樣 只是這樣就不是 prototype

interface StringConstructor {
    format: (formatString: string, ...replacement: any[]) => string;
}


String.format = function (formatString, ...replacement) {
    var args = replacement;
    return formatString.replace(/{(\d+)}/g, function(match, number) { 
        return typeof args[number] != 'undefined'
            ? args[number]
            : match;
    });
}

// let b = '{0} {1}'.format('1', '2')
let b = String.format('{0} {1}', 1, 2)
console.log(b)

也可以參考 player 大 貼的那篇

我要發表回答

立即登入回答