如何让可选链在 TypeScript 中工作?
How to get optional chaining working in TypeScript?
看起来像可选链has landed. Here's an example
我想不通的是如何让 TS 正确编译它。我的项目中没有出现任何语法错误,但是:
let imageFileId = (await db.query(sql`select id from image_files where sha256=${sha256}`))[0]?.id;
输出为:
let imageFileId = (await db.query(mysql3_1.sql `select id from image_files where sha256=${sha256}`))[0]?.id;
这不会 运行 直到我们在 Node 中获得本机支持。
这是我的 tsconfig:
{
"compilerOptions": {
"strict": true,
"importHelpers": false,
"inlineSources": true,
"noEmitOnError": true,
"pretty": true,
"module": "commonjs",
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": false,
"removeComments": false,
"preserveConstEnums": false,
"sourceMap": true,
"lib": ["es2018"],
"skipLibCheck": false,
"outDir": "dist",
"target": "esnext",
"declaration": false,
"resolveJsonModule": true,
"esModuleInterop": false,
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"baseUrl": ".",
"paths": {
"*": ["src/*"]
},
"noEmit": false
},
"files": [
"src/index"
],
"include": [
"src/**/*.d.ts"
]
}
是否需要启用其他选项来编译 ?.
运算符?
请注意我没有使用 Babel,我不想把它带入画面。
问题是您的目标是 esnext
这将告诉编译器按原样输出所有语言功能,而不进行任何转换。将语言设置为 es2020(或更低版本),?.
和 ??
将被转译为兼容代码:
(async function () {
let imageFileId = (await db.query(sql`select id from image_files where sha256=${sha256}`))[0]?.id;
})()
没有细粒度的控制来控制哪些语言特性被转译,哪些不被转译,不幸的是你必须选择一个版本作为一个整体,
好吧,我不想使用 Babel,因为那样我就必须弄清楚如何替换 ts-node
。有一堆过时的文档提到旧的 Babel 包,但这些说明应该在 2019 年 11 月起有效:
添加一个.babelrc
文件:
{
"presets": [
["@babel/preset-env",{"targets": {"node": "current"}}],
"@babel/preset-typescript"
],
"plugins": [
"@babel/plugin-syntax-bigint"
]
}
添加这些部门:
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.0",
"@babel/node": "^7.7.0",
"@babel/plugin-syntax-bigint": "^7.4.4",
"@babel/preset-env": "^7.7.1",
"@babel/preset-typescript": "^7.7.0",
"@types/node": "^12.7.5",
"typescript": "^3.7.2"
}
执行您的代码:
node_modules/.bin/babel-node --extensions ".ts" src/index.ts
--extensions ".ts"
非常重要,即使您明确尝试执行 .ts 文件,它也不会转译它 w/out。
我喜欢使用 GNU Make 而不是 package.json 脚本:
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
NM := node_modules/.bin
.PHONY: build start dev clean test publish
## commands
########################################
__default:
$(error Please specify a target)
build: build-types build-js dist/package.json
build-types: node_modules/.yarn-integrity
$(NM)/tsc --emitDeclarationOnly
build-js: node_modules/.yarn-integrity
$(NM)/babel src --out-dir dist --extensions ".ts" --source-maps inline
run: node_modules/.yarn-integrity
$(NM)/babel-node --extensions ".ts" src/index.ts
check: node_modules/.yarn-integrity
$(NM)/tsc --noEmit
dist:
mkdir -p $@
clean:
rm -rf node_modules dist yarn-error.log
dist/package.json: package.json | dist
jq 'del(.private, .devDependencies, .scripts, .eslintConfig, .babel)' $< > $@
## files
########################################
node_modules/.yarn-integrity: yarn.lock
@yarn install --frozen-lockfile --production=false --check-files
@touch -mr $@ $<
yarn.lock: package.json
@yarn check --integrity
@touch -mr $@ $<
复制
看起来像可选链has landed. Here's an example
我想不通的是如何让 TS 正确编译它。我的项目中没有出现任何语法错误,但是:
let imageFileId = (await db.query(sql`select id from image_files where sha256=${sha256}`))[0]?.id;
输出为:
let imageFileId = (await db.query(mysql3_1.sql `select id from image_files where sha256=${sha256}`))[0]?.id;
这不会 运行 直到我们在 Node 中获得本机支持。
这是我的 tsconfig:
{
"compilerOptions": {
"strict": true,
"importHelpers": false,
"inlineSources": true,
"noEmitOnError": true,
"pretty": true,
"module": "commonjs",
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": false,
"removeComments": false,
"preserveConstEnums": false,
"sourceMap": true,
"lib": ["es2018"],
"skipLibCheck": false,
"outDir": "dist",
"target": "esnext",
"declaration": false,
"resolveJsonModule": true,
"esModuleInterop": false,
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"baseUrl": ".",
"paths": {
"*": ["src/*"]
},
"noEmit": false
},
"files": [
"src/index"
],
"include": [
"src/**/*.d.ts"
]
}
是否需要启用其他选项来编译 ?.
运算符?
请注意我没有使用 Babel,我不想把它带入画面。
问题是您的目标是 esnext
这将告诉编译器按原样输出所有语言功能,而不进行任何转换。将语言设置为 es2020(或更低版本),?.
和 ??
将被转译为兼容代码:
(async function () {
let imageFileId = (await db.query(sql`select id from image_files where sha256=${sha256}`))[0]?.id;
})()
没有细粒度的控制来控制哪些语言特性被转译,哪些不被转译,不幸的是你必须选择一个版本作为一个整体,
好吧,我不想使用 Babel,因为那样我就必须弄清楚如何替换 ts-node
。有一堆过时的文档提到旧的 Babel 包,但这些说明应该在 2019 年 11 月起有效:
添加一个.babelrc
文件:
{
"presets": [
["@babel/preset-env",{"targets": {"node": "current"}}],
"@babel/preset-typescript"
],
"plugins": [
"@babel/plugin-syntax-bigint"
]
}
添加这些部门:
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.0",
"@babel/node": "^7.7.0",
"@babel/plugin-syntax-bigint": "^7.4.4",
"@babel/preset-env": "^7.7.1",
"@babel/preset-typescript": "^7.7.0",
"@types/node": "^12.7.5",
"typescript": "^3.7.2"
}
执行您的代码:
node_modules/.bin/babel-node --extensions ".ts" src/index.ts
--extensions ".ts"
非常重要,即使您明确尝试执行 .ts 文件,它也不会转译它 w/out。
我喜欢使用 GNU Make 而不是 package.json 脚本:
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
NM := node_modules/.bin
.PHONY: build start dev clean test publish
## commands
########################################
__default:
$(error Please specify a target)
build: build-types build-js dist/package.json
build-types: node_modules/.yarn-integrity
$(NM)/tsc --emitDeclarationOnly
build-js: node_modules/.yarn-integrity
$(NM)/babel src --out-dir dist --extensions ".ts" --source-maps inline
run: node_modules/.yarn-integrity
$(NM)/babel-node --extensions ".ts" src/index.ts
check: node_modules/.yarn-integrity
$(NM)/tsc --noEmit
dist:
mkdir -p $@
clean:
rm -rf node_modules dist yarn-error.log
dist/package.json: package.json | dist
jq 'del(.private, .devDependencies, .scripts, .eslintConfig, .babel)' $< > $@
## files
########################################
node_modules/.yarn-integrity: yarn.lock
@yarn install --frozen-lockfile --production=false --check-files
@touch -mr $@ $<
yarn.lock: package.json
@yarn check --integrity
@touch -mr $@ $<
复制