Программа Basi c TypeScript NodeJS со структурой определения клиентской утилиты, использующей строгие правила кодирования - PullRequest
0 голосов
/ 22 апреля 2020

Как мне нарисовать базовый TypeScript «barebone» для запуска программы с использованием строгих настроек, учитывая следующую структуру программы?

  1. Базовый «клиентский» код с моими реальными программными логи c
  2. "Утилита" модуль для определения функций и расширений (я могу затем извлечь другие модули из этого)
  3. Файл определения, чтобы разрешить расширения из служебного модуля в (2).

Все это с использованием строгих правил TypeScript, чтобы гарантировать, что я использую преимущества TypeScript по сравнению с обычным JavaScript. Другими словами, используя tsconfig. json, как показано ниже:

{
  "compilerOptions": {
    "strictNullChecks": true,
    "allowJs": false,
    "alwaysStrict": true,
    "noImplicitAny": true,
    "types": [
      "node"
    ]
  }
}

Итак, никаких строгих проверок на ноль, никакой простой js не разрешено, всегда строгой, никакой неявной какой-либо и каждый импортированный тип явно указан в проекте.

Единственное "расслабленное" правило здесь - это секции include, exclude и files из файла проекта TypeScript, поэтому любые файлы .ts, .d.ts и .tsx в текущем каталоге включаются в процесс сборки (т. е. нет неиспользуемого / несвязанного исходного кода в папке).

1 Ответ

0 голосов
/ 22 апреля 2020

После долгой борьбы я мог придумать следующую структуру. Совместное использование для тех, кто еще может начинать с TypeScript и хотеть того же, что и у меня.

Учитывая, что это приложение NodeJS, у нас будет как минимум пакет @ types / Node, установленный с npm -i @types/Node

NPM связанных задач

  1. Создать package.json с npm init
  2. Установить @types/node с npm install @types/node

Задачи, связанные с TypeScript

  1. Создайте точно такой же файл tsconfig. json, как файл в вопросе:

tsconfig. json

{
  "compilerOptions": {
    "strictNullChecks": true,
    "allowJs": false,
    "alwaysStrict": true,
    "noImplicitAny": true,
    "types": [
      "node"
    ]
  }
}
Создать пример файла .d.ts (этот файл расширяет строку с помощью функции 'test')

string.d.ts

interface String {
  test(this: string) : string;
}
Создать служебный модуль

utils.ts

String.prototype.test = function (this : string) : string {
  var str = this;
  str = str + " - test";
  return str;
}

function textIsTest(what : string) : boolean {
  return what == "test";
}

export { textIsTest };
ваш "основной" код:

index.ts

import * as util from "./utils";

let params = process.argv.slice(2); // split commandline arguments

let testString = params[0];

console.log("Commandline parameter: " + testString);
console.log("Extended string: " + testString.test());
console.log("Is 'test': " + util.textIsTest(testString));

Это сделано в надежде, что это поможет другим людям, начинающим с TypeScript !. .

Дополнительно: watch + runner

Пакетный (bash) скрипт для просмотра и запуска проекта. Должен работать в cygwin, linux и ma c (протестировано только на cygwin):

#!/bin/bash

function spinner_update() {
 case "${lastchar}" in
  "-") lastchar="\\";;
  "\\") lastchar="|";;
  "|") lastchar="/";;
  *) lastchar="-";;
 esac
 echo -ne "\b${lastchar}"
}

function spinner_start() {
  local msg="${@}"
  trap handle_sigint SIGINT

  if [ ! -z "${msg}" ]; then
   msg="- ${msg}: "
  fi
  lastchar="-"
  echo -n "${msg}${lastchar}"
}

function spinner_clear() {
  trap "" SIGINT
  msg="${@}"
  echo -e "\b${msg}"
}

function handle_sigint() {
  echo -e "\binterrupted."
  exit
}

lastrun="0"
spinner_start "Polling for changes (^c aborts)"
while true; do
 for ts in $(stat *.ts tsconfig.json package.json package-lock.json --format="%Y"); do
  if [ ${ts} -gt ${lastrun} ]; then
   lastrun="$(date +%s)"
   spinner_clear "changes detected."
   echo -n "- Changes detected, building: "
   tsc
   echo "done, running."
   node index.js test
   retstat="${?}"

   if [ ${retstat} -ne 0 ]; then
    echo "*** Script returned error."
   else
    echo "- Script run successfully."
   fi
   spinner_start "Polling for changes (^c aborts)"
   break
  fi
 done

 if [ $(stat "${BASH_SOURCE}" --format="%Y") -gt ${lastrun} ]; then
  spinner_clear "watcher script changed."
  echo "*** Warning: This script has been changed. Aborting."
  exit 1
 fi
 sleep 1
 spinner_update
done

Он будет наблюдать за изменениями в файлах в текущем каталоге через отметку времени последнего изменения файлов; с хорошим обновлением "spinner" при опросе на предмет изменений; изящно прерывается, если нажата ctrl+c, и прерывается, если изменяется тот же сценарий. Изменения необходимы для отслеживания изменений в файлах в подкаталогах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...