網站搜尋

javascript - 模板字面量類型:超出最大調用堆疊大小


我收到以下錯誤:

ERROR in RangeError: Maximum call stack size exceeded
    at getResolvedBaseConstraint (/project/node_modules/typescript/lib/typescript.js:53262:43)
    at getBaseConstraintOfType (/project/node_modules/typescript/lib/typescript.js:53242:34)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:37)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)
    at getTypeFacts (/project/node_modules/typescript/lib/typescript.js:62711:24)

我在 global.d.ts 中有以下內容:

declare type UserId = `${number}`;
declare interface DevEnvironment {
  dev?: {
    user?: {
      userId?: UserId;
    }
  }
}

在上述介面中,如果我將 userId?: UserId 改成 userId?: string,那麼上述錯誤就會消失。我認為這是因為這個模板字串的錯誤。

然而,我是這樣使用上面的;在這裡,我正在我的開發環境中建立我的環境檔案:

let dev = {};
try {
  // The below file may or may not exists depending on the environment
  dev = require('./environment.local').dev;
} catch (e) { }

export const environment = Object.assign({}, {
  // Main environment variables
}, {dev: dev || {}} as DevEnvironment);

然後我在服務中使用它:

@Injectable({ providedIn: 'root' })
export class User {
  get userId(): UserId {
    const defaultValue = (environment.dev?.user?.userId || '000000000') as UserId;
  }
}

我知道這個問題據說在更新版本的 TypeScript 中已經修復,但由於使用 Angular 11 CLI,我們被限制在 4.1.5,如下所示:

npm i typescript@^4.2.0
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! Found: @angular/[email 
npm ERR! node_modules/@angular/compiler-cli
npm ERR!   dev @angular/compiler-cli@"^11.2.11" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer @angular/compiler-cli@"^10.0.0" from @angular-devkit/[email 
npm ERR! node_modules/@angular-devkit/build-angular
npm ERR!   @angular-devkit/build-angular@">=0.1000.0 < 0.1100.0" from @angular-builders/[email 
npm ERR!   node_modules/@angular-builders/custom-webpack
npm ERR!     dev @angular-builders/custom-webpack@"^10.0.1" from the root project
npm ERR!   dev @angular-devkit/build-angular@"^0.1002.3" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /Users/rnaddy/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/rnaddy/.npm/_logs/2021-07-08T15_28_45_346Z-debug.log

有什麼我可以做的來使用我最初想使用的語法嗎?

答案#1

如果你使用的 TypeScript 版本低於 4,就會出現這個錯誤,升級到最新版本然後放輕鬆))

答案#2

這是一個內部的 Typescript 錯誤,對我來說生產環境可以運作,但開發環境不行。

按照建議更新 TypeScript,即使輸出不完全相同,問題也是一樣的。

我完全不知道哪個版本實際上可用,我最終用了4.x.x,它神奇地如預期般工作了。