How to get optional chaining working in TypeScript?

前端 未结 2 1249
旧时难觅i
旧时难觅i 2021-02-08 11:47

Looks like optional chaining has landed. Here\'s an example

What I can\'t figure out is how to get TS to compile it properly. I\'m not getting any syntax errors in my pr

相关标签:
2条回答
  • 2021-02-08 12:09

    The problem is you are targeting esnext this will tell the compiler to output all language features as is without any transpilation. Set the language to es2020 (or below) and ?. and ?? will get transpiled to compatible code:

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

    Playground Link

    There is no fine-grained control over which language features get transpiled and which don't do you have to pick a version as a whole unfortunately,

    0 讨论(0)
  • 2021-02-08 12:16

    Well, I didn't want to use Babel because then I'd have to figure out how to replace ts-node. There's a bunch of outdated docs out there referring to old Babel packages, but these instructions should work as of Nov 2019:

    Add a .babelrc file:

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

    Add these deps:

      "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"
      }
    

    Execute your code with:

    node_modules/.bin/babel-node --extensions ".ts" src/index.ts
    

    The --extensions ".ts" is very important, even though you're explicitly trying to execute a .ts file, it won't transpile it w/out that.

    I like to use GNU Make instead of package.json scripts:

    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 $@ $<
    

    Or just copy from Microsoft's TypeScript Babel Starter.

    0 讨论(0)
提交回复
热议问题