在给定以下程序结构的情况下,我应该如何绘制基本TypeScript"barebone"来使用严格的设置启动程序?
- 带有实际程序逻辑的基本"客户端"代码
- 定义函数和扩展的"实用程序"模块(然后我可以从这个模块派生其他模块(
- 允许来自(2(中的实用程序模块的扩展名的定义文件
所有这些都使用了严格的TypeScript规则,以确保我在利用TypeScript功能而不是普通JavaScript。换句话说,使用tsconfig.json,如下所示:
{
"compilerOptions": {
"strictNullChecks": true,
"allowJs": false,
"alwaysStrict": true,
"noImplicitAny": true,
"types": [
"node"
]
}
}
因此,没有严格的null检查,不允许使用纯js,始终严格,没有隐式any,并且每个导入的类型都在项目中明确指定。
这里唯一的"宽松">规则是TypeScript项目文件中的include
、exclude
和files
部分,因此当前目录中的任何.ts
、.d.ts
和.tsx
文件都包含在构建过程中(即,文件夹中没有未使用/不相关的源代码(。
经过多次努力,我终于想出了以下结构。分享给其他可能从TypeScript开始并想要和我一样的人。
考虑到这是一个NodeJS应用程序,我们将使用npm -i @types/Node
安装@types/Node包作为最低要求
NPM相关任务
- 使用
npm init
创建package.json
- 用
npm install @types/node
安装@types/node
TypeScript相关任务
- 创建与问题中的文件完全相同的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 };
- 您的"主"代码:
指数.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
,则正常中断,如果更改了相同的脚本,则中止。需要进行更改以监视子目录中文件的更改。