typescript - 具有客户端实用程序定义结构的基本 TypeScript NodeJS 程序,使用严格的编码规则
问题描述
给定以下程序结构,我应该如何绘制基本 TypeScript“准系统”以使用严格的设置启动程序?
- 带有我实际程序逻辑的基本“客户端”代码
- 用于定义功能和扩展的“实用程序”模块(然后我可以从中派生其他模块)
- 允许从 (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
解决方案
经过一番努力,我可以想出以下结构。为其他可能从 TypeScript 开始并想要和我一样的人分享。
记住这是一个 NodeJS 应用程序,我们将至少安装 @types/Node 包npm -i @types/Node
NPM 相关任务
- 创建
package.json
与npm init
- 安装
@types/node
_npm install @types/node
TypeScript 相关任务
- 创建与问题中完全相同的tsconfig.json文件:
tsconfig.json
{
"compilerOptions": {
"strictNullChecks": true,
"allowJs": false,
"alwaysStrict": true,
"noImplicitAny": true,
"types": [
"node"
]
}
}
- 创建示例 .d.ts 文件(这个扩展了带有“测试”功能的字符串)
字符串.d.ts
interface String {
test(this: string) : string;
}
- 创建实用程序模块
实用程序.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 };
- 你的“主要”代码:
索引.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
,如果相同的脚本被更改则将中止。需要更改以监视子目录中文件的更改。
推荐阅读
- python - RaspberryPi 在预期条件下的 Selenium 超时
- c - 从设备驱动程序的 C 代码中“调用”特定函数
- c++ - 编译 gcc-7.3.0 时未找到 uint64_t 或 int64_t 错误
- python-3.x - 2-sum 问题:给定一个未排序的整数列表,找出两个元素的总和是否为给定的目标。如何让我的代码更 Pythonic?
- common-lisp - 一个简单的 Common-Lisp 猫
- r - 如何使用 hdf5r(而不是 rhdf5)将 hdf5 文件的所有内容转储到 R 列表中
- python - 无法抓取特定表
- cron - 在 Moodle 中执行 cron 后,作业文件不会通过课程重置被删除
- php - 使用 Post 方法在 Mysql 中创建新用户失败
- python - SDMX-Json 解析 - 没有 Time_Period 问题 - OECD 数据集 python 提取