我只是想使用打字稿构建一个 firebase 函数。现在我的文件如下:
import { onRequest } from "firebase-functions/v2/https";
import * as logger from "firebase-functions/logger";
import * as admin from "firebase-admin";
admin.initializeApp();
// Start writing functions
// https://firebase.google.com/docs/functions/typescript
export const helloWorld = onRequest((request, response) => {
logger.info("Hello logs!", { structuredData: true });
response.send("Hello from Firebase!");
});
这是我的 tsconfig:
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017"
},
"compileOnSave": true,
"include": [
"src"
]
}
以及添加的措施 package.json
{
"name": "functions",
"scripts": {
"build": "tsc",
"build:watch": "tsc --watch",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "18"
},
"main": "lib/index.js",
"dependencies": {
"firebase-admin": "^12.1.0",
"firebase-functions": "^5.0.0"
},
"devDependencies": {
"typescript": "^4.9.0",
"firebase-functions-test": "^3.1.0"
},
"private": true
}
现在,有趣的部分。当我运行时
tsc index.ts
我收到以下错误消息
../node_modules/gaxios/build/src/gaxios.d.ts:6:5 - error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher.
6 #private;
~~~~~~~~
../node_modules/google-auth-library/build/src/auth/awsclient.d.ts:84:5 - error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher.
84 #private;
~~~~~~~~
../node_modules/google-auth-library/build/src/util.d.ts:134:5 - error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher.
134 #private;
~~~~~~~~
../node_modules/gtoken/build/src/index.d.ts:38:5 - error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher.
38 #private;
~~~~~~~~
Found 4 errors in 4 files.
Errors Files
1 ../node_modules/gaxios/build/src/gaxios.d.ts:6
1 ../node_modules/google-auth-library/build/src/auth/awsclient.d.ts:84
1 ../node_modules/google-auth-library/build/src/util.d.ts:134
1 ../node_modules/gtoken/build/src/index.d.ts:38
我不知道我做错了什么。这以前从来不是问题。该代码正在一个独立的文件夹中运行,因此它不会干扰其他依赖项。请有人帮忙。
错误消息表明正在尝试使用 TypeScript 中的私有标识符,但的目标是 ECMAScript 版本低于支持私有标识符的版本。
问题:
在
tsconfig.json
文件中将
target
设置为
es2017
。但是,正在使用的某些依赖项(
gaxios
、
google-auth-library
、
gtoken
)使用了私有标识符,这些标识符在 ECMAScript 2015 及更高版本中才可用。
解决方案:
需要将
tsconfig.json
文件中的
target
选项更新为
es2015
或更高版本,以支持私有标识符。
{
"compilerOptions": {
// ... other options
"target": "es2020" // 或更高版本,例如 "esnext"
}
}
解释:
target
选项告诉 TypeScript 编译器要生成哪个版本的 JavaScript 代码。将
target
设置为较旧的 ECMAScript 版本(例如
es5
或
es2015
)将导致编译器生成与那些版本兼容的代码,但不包括对较新 JavaScript 功能的支持,例如私有标识符。
其他建议:
-
确保使用的所有依赖项都与选择的
target
ECMAScript 版本兼容。 -
运行
npm install
以确保所有依赖项都已安装并更新。 -
考虑使用
ts-node
或ts-node-dev
在开发过程中运行 TypeScript 代码,因为它会自动处理编译过程。
完成这些更改后,再次运行
tsc index.ts
命令,应该不会再遇到此错误。