首页 > 解决方案 > 具有客户端实用程序定义结构的基本 TypeScript NodeJS 程序,使用严格的编码规则

问题描述

给定以下程序结构,我应该如何绘制基本 TypeScript“准系统”以使用严格的设置启动程序?

  1. 带有我实际程序逻辑的基本“客户端”代码
  2. 用于定义功能和扩展的“实用程序”模块(然后我可以从中派生其他模块)
  3. 允许从 (2) 中的实用程序模块进行扩展的定义文件。

所有这一切都使用严格的 TypeScript 规则来确保我利用 TypeScript 的功能而不是普通的 JavaScript。换句话说,使用tsconfig.json如下:

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

因此,没有严格的空检查,不允许普通的 js,总是严格的,没有隐式的,并且在项目中明确指定了每个导入的类型。

这里唯一的“宽松”规则是TypeScript 项目文件中的include,exclude和部分,因此当前目录中的任何,和文件都包含在构建过​​程中(也就是说,文件夹中没有未使用/不相关的源代码)。files.ts.d.ts.tsx

标签: typescriptmodulesamplestrict

解决方案


经过一番努力,我可以想出以下结构。为其他可能从 TypeScript 开始并想要和我一样的人分享。

记住这是一个 NodeJS 应用程序,我们将至少安装 @types/Node 包npm -i @types/Node

NPM 相关任务

  1. 创建package.jsonnpm 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"
    ]
  }
}
  1. 创建示例 .d.ts 文件(这个扩展了带有“测试”功能的字符串)

字符串.d.ts

interface String {
  test(this: string) : string;
}
  1. 创建实用程序模块

实用程序.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 };
  1. 你的“主要”代码:

索引.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 开始的人!..

额外:手表+跑步者

用于监视和运行项目的批处理 (bash) 脚本。应该在 cygwin、linux 和 mac 中工作(仅在 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

它将通过文件的最后更改时间戳来监视当前目录中文件的更改;在轮询更改时有一个不错的“微调器”更新;如果被按下则优雅地中断ctrl+c,如果相同的脚本被更改则将中止。需要更改以监视子目录中文件的更改。


推荐阅读