乐趣区

在命令行中执行 ts

配置 npm 淘宝源
npm config set registry https://registry.npm.taobao.org/
如果后悔了,想撤销淘宝源就运行 npm config delete registry
在命令行运行 ts 文件
首先需要安装 ts,ts-node
npm install typescript -g
npm install ts-node -g

新建 1.ts 文件,写上这两句话
#!/usr/bin/env ts-node
console.log(‘hello world’)

添加可执行权限(windows 用户可直接执行第 3 步)
chmod +x 1.ts

在命令行中执行 1.ts 文件
./1.ts

就可以看到终端中输出 hello world

接收命令行参数

将 hello world 改成 process.argy:
#!/usr/bin/env ts-node
console.log(process.argv)

如果没有配置好 TS,那么运行./1.ts 上面代码会出现如下报错:
/usr/local/lib/node_modules/ts-node/src/index.ts:226
return new TSError(diagnosticText, diagnosticCodes)
^
TSError: ⨯ Unable to compile TypeScript:
1.ts:2:13 – error TS2580: Cannot find name ‘process’. Do you need to install type definitions for node? Try `npm i @types/node`.

2 console.log(process.argv)
at createTSError (/usr/local/lib/node_modules/ts-node/src/index.ts:226:12)
at getOutput (/usr/local/lib/node_modules/ts-node/src/index.ts:335:40)
at Object.compile (/usr/local/lib/node_modules/ts-node/src/index.ts:368:11)
at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:414:43)
at Module._extensions..js (internal/modules/cjs/loader.js:745:10)
at Object.require.extensions.(anonymous function) [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:417:12)
at Module.load (internal/modules/cjs/loader.js:626:32)
at tryModuleLoad (internal/modules/cjs/loader.js:566:12)
at Function.Module._load (internal/modules/cjs/loader.js:558:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:797:12)

根据上面的提示,需要安装 types/node,所以具体步骤如下:
npm init -y
npm install @types/node

再次运行 1.ts,就会在终端上看到
[‘/usr/local/bin/ts-node’, ‘/Users/mac/Desktop/ts/demo/1.ts’]

在 1.ts 后面接上参数运行
1.ts 2 5

终端上会显示
[‘/usr/local/bin/ts-node’, ‘/Users/mac/Desktop/ts/demo/1.ts’, ‘2’, ‘5’]

四则运算

现在已经能够接受命令行的参数了,如何用接受的参数做四则运算?
#!/usr/bin/env ts-node
const num1 = parseInt(process.argv[2])
const num2 = parseInt(process.argv[3])
console.log(num1 + num2)

在命令行中执行下面命令,会得到 8
./1.ts 3 5

但是现在还不能处理,非数字参数,会得到 NaN
./1.ts 3 s

做一个判断,如果不是数字就退出
#!/usr/bin/env ts-node
const num1: number = parseInt(process.argv[2])
const num2: number = parseInt(process.argv[3])
console.log(num1 + num2)
if (Number.isNaN(num1) || Number.isNaN(num2)) {
console.log(‘ 输入有误 ’)
return
}
console.log(num1 + num2)

return 是不能用在顶层作用域中的,所以这里应该使用 process.exit(N),其中的 N 是返回值。
#!/usr/bin/env ts-node
const num1: number = parseInt(process.argv[2])
const num2: number = parseInt(process.argv[3])
console.log(num1 + num2)
if (Number.isNaN(num1) || Number.isNaN(num2)) {
console.log(‘ 输入有误 ’)
process.exit(1)
}
console.log(num1 + num2)
process.exit(0)

打印族谱
#!/usr/bin/env ts-node
class Person {
public children: Person[] = [] //children 是个数组,里面每一项都必须是 Person,用 public 可以声明一个属性;必须要初始化,否下面 push 用不了
constructor (public name: string){} // 可以声明一个 name 属性
addChild(child: Person): void {
this.children.push(child)
}
introduceFamily (n?: number): void {//? 是可选参数
n = n || 1
console.log(`${‘—-‘.repeat(n – 1)}${this.name}`) //repeat,重复
this.children.forEach(child => {
child.introduceFamily(n + 1) // 递归
})
}
}
let grandpa = new Person(‘ 张三 ’)
let child1 = new Person(‘ 张四 ’)
let child2 = new Person(‘ 张五 ’)
let child11 = new Person(‘ 张四一 ’)
let child12 = new Person(‘ 张四二 ’)
let child21 = new Person(‘ 张五一 ’)
let child22 = new Person(‘ 张五二 ’)

grandpa.addChild(child1) // 往 children 中添加 孩子 时,必须用先 实例化,不能直接添加
grandpa.addChild(child2)
child1.addChild(child11)
child1.addChild(child12)
child2.addChild(child21)
child2.addChild(child22)

grandpa.introduceFamily(1) // 最高的层级的调用
输出:
张三
—- 张四
——– 张四一
——– 张四二
—- 张五
——– 张五一
——– 张五二

退出移动版