基本的TypeScript NodeJS程序具有客户端实用程序定义结构,使用严格的编码规则



在给定以下程序结构的情况下,我应该如何绘制基本TypeScript"barebone"来使用严格的设置启动程序?

  1. 带有实际程序逻辑的基本"客户端"代码
  2. 定义函数和扩展的"实用程序"模块(然后我可以从这个模块派生其他模块(
  3. 允许来自(2(中的实用程序模块的扩展名的定义文件

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

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

因此,没有严格的null检查,不允许使用纯js,始终严格,没有隐式any,并且每个导入的类型都在项目中明确指定。

这里唯一的"宽松">规则是TypeScript项目文件中的includeexcludefiles部分,因此当前目录中的任何.ts.d.ts.tsx文件都包含在构建过程中(即,文件夹中没有未使用/不相关的源代码(。

经过多次努力,我终于想出了以下结构。分享给其他可能从TypeScript开始并想要和我一样的人。

考虑到这是一个NodeJS应用程序,我们将使用npm -i @types/Node安装@types/Node包作为最低要求

NPM相关任务

  1. 使用npm init创建package.json
  2. npm install @types/node安装@types/node

TypeScript相关任务

  1. 创建与问题中的文件完全相同的tsconfig.json文件:

tsconfig.json

{
"compilerOptions": {
"strictNullChecks": true,
"allowJs": false,
"alwaysStrict": true,
"noImplicitAny": true,
"types": [
"node"
]
}
}
  1. 创建示例.d.ts文件(此文件使用"test"函数扩展字符串(

string.d.ts

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

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 };
  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中工作(仅在cygwn上测试(:

#!/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,则正常中断,如果更改了相同的脚本,则中止。需要进行更改以监视子目录中文件的更改。

最新更新