Typescript中報錯元素隱式具有 any 型別,因為型別沒有索引簽名

在用Ts重構一個時間日期格式化外掛時報了一個型別沒有索引沒有簽名的異常

時間格式化外掛如下:

interface OType { ‘m+’: number; ‘d+’: number; ‘h+’: number; ‘i+’: number; ‘s+’: number;} // 正則格式化日期 const formatDate = (date: Date, dateFormat: string): string => { if (/(y+)/。test(dateFormat)) { dateFormat = dateFormat。replace( RegExp。$1, `${date。getFullYear()}`。substr(4 - RegExp。$1。length) ); } // 格式化日、時、分、秒後面的+號用於正則的匹配 const o: OType = { ‘m+’: date。getMonth() + 1, // 月 ‘d+’: date。getDate(), // 天 ‘h+’: date。getHours(), // 時 ‘i+’: date。getMinutes(), // 分 ‘s+’: date。getSeconds(), // 秒 }; Object。keys(o)。forEach((k): void => { // 由於編輯器裡面不認``號,程式碼飄紅,不是程式碼有問題,這些在開發中一直使用,在vscode不會飆紅 if (new RegExp(`(${k})`)。test(dateFormat)) { // 取出對應的值 const str = `${o[k]}`; // RegExp。$1 指的是與正則表示式匹配的第一個 子匹配(以括號為標誌)字串 dateFormat = dateFormat。replace( RegExp。$1, RegExp。$1。length === 1 ? str : padLeftZero(str) ); } }); return dateFormat; }; // 日期時間補零 const padLeftZero = (str: string): string => { return `00${str}`。substr(str。length); };

這時編譯會報錯

Typescript中報錯元素隱式具有 any 型別,因為型別沒有索引簽名

滑鼠放在報錯的飄紅位置提示錯誤資訊如下

Typescript中報錯元素隱式具有 any 型別,因為型別沒有索引簽名

解決辦法:1。在宣告介面OType 新增[key: string]: number;約束

interface OType { ‘m+’: number; ‘d+’: number; ‘h+’: number; ‘i+’: number; ‘s+’: number; [key: string]: number; // 新增約束}

解決辦法:2。使用斷言型別約束

Typescript中報錯元素隱式具有 any 型別,因為型別沒有索引簽名