Как получить необязательную работу цепочек в TypeScript? - PullRequest
1 голос
/ 06 ноября 2019

Похоже, что дополнительная цепочка приземлилась . Вот пример

Я не могу понять, как заставить 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"
    ]
}

Есть ли какой-то другой параметр, который мне нужно включить для компиляции оператора ?.?

Обратите внимание, что я не с использованием Бабеля, и я не хочу вносить это в изображение.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Проблема в том, что вы нацелены на esnext, это скажет компилятору выводить все языковые функции без каких-либо действий. Например, установите язык es2020, и ?. и ?? будут преобразованы в совместимый код:

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

Playground Link

Детальный контроль над тем, какие языковые функции передаются, а какие нет, к сожалению, вам приходится выбирать версию в целом,

1 голос
/ 06 ноября 2019

Ну, я не хотел использовать Babel, потому что тогда я должен был бы выяснить, как заменить ts-node. Есть куча устаревших документов, ссылающихся на старые пакеты Babel, но эти инструкции должны работать с ноября 2019 года:

Добавить файл .babelrc:

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

Добавить эти 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"
  }

Выполните ваш код с помощью:

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 TypeScript Babel Starter .

...