代码之家  ›  专栏  ›  技术社区  ›  mpen

如何让可选链接在TypeScript中工作?

  •  0
  • mpen  · 技术社区  · 5 年前

    看起来像是可选的链接 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;
    

    在节点中获得本机支持之前不会运行。

    这是我的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"
        ]
    }
    

    我是否需要启用其他选项来编译 ?. 接线员?

    1 回复  |  直到 5 年前
        1
  •  19
  •   Titian Cernicova-Dragomir    4 年前

    问题是你的目标是 esnext 这将告诉编译器以原样输出所有语言特性,而不进行任何编译。将语言设置为es2020(或更低)并 ?. ?? 将被传输到兼容代码:

    (async function () {
        let imageFileId = (await db.query(sql`select id from image_files where sha256=${sha256}`))[0]?.id;
    })()
    

    Playground Link

        2
  •  4
  •   mpen    5 年前

    好吧,我不想用巴别塔,因为那样我就得想办法替换它 ts-node . 有一堆过时的文件提到旧的巴贝尔软件包,但这些说明应该从2019年11月起生效:

    .babelrc 文件:

    {
        "presets": [
            ["@babel/preset-env",{"targets": {"node": "current"}}],
            "@babel/preset-typescript"
        ],
        "plugins": [
            "@babel/plugin-syntax-bigint"
        ]
    }
    

    添加这些DEP:

      "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文件,它也不会将其传输出去。

    我喜欢使用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 $@ $<
    

    Microsoft's TypeScript Babel Starter .