Làm cách nào để chạy các tệp TypeScript từ dòng lệnh?


206

Tôi đang có một thời gian khó khăn đáng ngạc nhiên để tìm một câu trả lời cho điều này. Với Node.JS đơn giản, bạn có thể chạy bất kỳ tệp js nào node path/to/file.js, với CoffeeScript, nó coffee hello.coffeevà ES6 có babel-node hello.js. Làm thế nào để tôi làm tương tự với Bản in?

Dự án của tôi có một tsconfig.jsonứng dụng được sử dụng bởi Webpack / ts-loader để xây dựng một gói nhỏ đẹp cho trình duyệt. Mặc dù vậy, tôi cần một bước xây dựng chạy từ bàn điều khiển trước đó, tuy nhiên, nó sẽ sử dụng một số .tstệp được sử dụng trong dự án để tạo lược đồ, nhưng dường như tôi không thể chạy một tệp Kiểu chữ duy nhất mà không cần biên dịch Toàn bộ dự án.

Câu trả lời:


270

Làm thế nào để tôi làm tương tự với Bản in

Bạn có thể tiếp tsctục chạy trong chế độ đồng hồ bằng cách sử dụng tsc -w -p .và nó sẽ tạo .jscác tệp cho bạn theo cách trực tiếp, do đó bạn có thể chạy node foo.jsnhư bình thường

Nút TS

Có nút ts: https://github.com/TypeStrong/ts-node sẽ biên dịch mã khi đang bay và chạy nó qua nút

npx ts-node src/foo.ts

10
tsc ghi js vào đĩa. ts-node không cần phải làm điều đó và chạy ts một cách nhanh chóng
basarat

1
chỉ nhắc nhở ts-node không điều khiển đăng nhập từ các mô-đun đã nhập. Đối với Ex: nếu bạn là ts-nút fil1.ts và file1.ts sử dụng file2.ts bên trong, thì nhật ký giao diện điều khiển từ file2.ts sẽ không được ghi lại.
Shadab Faiz

1
Một con cá trích đỏ phải cẩn thận với điều đó tôi đã chạy vào và làm tôi bối rối. Tôi đã có một tệp TypeScript đơn giản có tên test.tskhông bao giờ được dịch mã và có một dòng mã duy nhất: console.log('hello');trong đó. Tôi đang chạy node test.tstừ dòng lệnh và nó hoạt động xuất ra 'xin chào' khiến tôi bối rối. Vâng, nếu tập tin là hoàn toàn hợp lệ JavaScript và bạn chạy node myFile.tsvẫn hoạt động. Tuy nhiên đây không phải là trường hợp sử dụng tốt vì ngay khi tôi thêm mã TypeScript, tôi đã gặp lỗi khi cố chạy nó, đó là điều tôi mong đợi. Tôi muốn nút sẽ cảnh báo / lỗi khi chạy tập tin .ts.
atconway

3
nút ts FTW. npm install -g ts-nodelàm cho ts-node your-script.tsmột làn gió.
Luôn luôn học tập vào


41

Chúng tôi có các bước sau

  1. Đầu tiên bạn cần cài đặt bản thảo

    npm cài đặt -g bản thảo

2. Tạo một tệp helloworld.ts

function hello(person){
 return "Hello, " + person;
}
let user = "Aamod Tiwari";
const result = hello(user);
console.log("Result",result)

3. Mở dấu nhắc lệnh và gõ lệnh sau

tsc hellowworld.ts

  1. Một lần nữa chạy lệnh

nút helloworld.js

  1. Kết quả sẽ hiển thị trên bảng điều khiển

2
Trong trường hợp của bạn, chúng tôi chạy tệp .js chứ không phải tệp .ts.
Menai Ala Eddine - Aladdin

20

Để thêm vào câu trả lời @Aamod ở trên, Nếu bạn muốn sử dụng một dòng lệnh để biên dịch và chạy mã của mình, bạn có thể sử dụng như sau:

Các cửa sổ:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gđể cài đặt tscCLI
s2t2

1
Ah 'cửa sổ'
Rocky Li

Điều này sẽ không hoạt động nếu bạn muốn gỡ lỗi từng dòng nguồn bản thảo.
Paramvir Singh Karwal

20

Chạy các lệnh dưới đây và cài đặt các gói cần thiết trên toàn cầu:

npm install -g ts-node
npm install -g typescript

Bây giờ hãy chạy lệnh sau để thực thi một tệp bản thảo:

ts-node typescript-file.ts

2
Đây là cách tốt nhất để làm điều đó IMHO, ts-nodecũng như cung cấp TypeScript REPL.
tromgy

1
Bạn cũng có thể dựa vào npx ts-node yourscript.tstrong trường hợp bạn không muốn sử dụng phiên bản toàn cầu.
rafaelpivato


6

Chỉ cần thông tin hữu ích - đây là Deno mới nhất của TypeScript / JavaScript .

Nó được tạo bởi người tạo ra nút Ryan Dahl, dựa trên những gì anh ta sẽ làm khác đi nếu anh ta có thể bắt đầu mới.


1
Đây là một ví dụ:deno run https://deno.land/std/examples/welcome.ts
mozey

5

Viết cho mình một gói bash đơn giản có thể giúp đỡ.

#!/bin/bash
npx tsc $1 && node ${1%%.ts}

3

Không có câu trả lời nào khác thảo luận về cách chạy tập lệnh TypeScript sử dụng các mô-đun và đặc biệt là các Mô-đun ES hiện đại.

Trước hết, nút ts không hoạt động trong kịch bản đó, kể từ tháng 3 năm 2020. Vì vậy, chúng tôi sẽ giải quyết tsctiếp theonode .

Thứ hai, TypeScript vẫn không thể xuất .mjstệp . Vì vậy, chúng tôi sẽ giải quyết cho .jscác tập tin và "type": "module"trongpackage.json .

Thứ ba, bạn muốn importcác dòng sạch , mà không chỉ định .jsphần mở rộng (sẽ gây nhầm lẫn trong .tscác tệp):

import { Lib } from './Lib';

Chà, điều đó không tầm thường. Nút yêu cầu chỉ định tiện ích mở rộng khi nhập, trừ khi bạn sử dụng experimental-specifier-resolution=nodecờ. Trong trường hợp này, nó sẽ cho phép Node tìm kiếm Lib.jshoặc Lib/index.jskhi bạn chỉ định ./Libtrênimport dòng.

Thứ tư, vẫn còn một nhược điểm: nếu bạn có maintên tệp khác với index.jsgói của mình, Node sẽ không tìm thấy nó .

Transpiling làm cho mọi thứ lộn xộn hơn nhiều so với chạy vanilla Node.

Đây là một repo mẫu với cấu trúc dự án TypeScript hiện đại , tạo mã ES Module.


1
Cảm ơn rất nhiều, đó gần như là chuỗi vấn đề chính xác mà tôi gặp phải khi cố gắng làm điều đó ngày hôm nay!
dgellow

3

Giống như câu trả lời của Zeeshan Ahmad , tôi cũng nghĩ ts-nodelà con đường để đi. Tôi cũng sẽ thêm một shebang và làm cho nó có thể thực thi được, vì vậy bạn chỉ có thể chạy nó trực tiếp.

  1. Cài đặt bản in và nút ts trên toàn cầu:

    npm install -g ts-node typescript

    hoặc là

    yarn global add ts-node typescript
  2. Tạo một tệp hellocó nội dung này:

    #!/usr/bin/env ts-node-script
    
    import * as os from 'os'
    
    function hello(name: string) {
        return 'Hello, ' + name
    }
    const user = os.userInfo().username
    console.log(`Result: ${hello(user)}`)

    Như bạn có thể thấy, dòng một có shebang cho nút ts

  3. Chạy trực tiếp bằng cách thực hiện các tập tin

    $ ./hello
    Result: Hello, root

Một số lưu ý:


Cập nhật 2020-04-06: Một số thay đổi sau khi nhập lớn trong các nhận xét: Cập nhật shebang để sử dụng ts-node-scriptthay vì ts-nodeliên kết đến các vấn đề trong nút ts.



1
Bạn có thể gặp nhiều vấn đề với phương pháp này. Tôi đã ghi lại các giải pháp tiềm năng trong vấn đề này . Đặc biệt, shebang #!/usr/bin/env ts-node-script(cũng là một phần của ts-node) dường như vượt trội cho mục đích này. Nếu bạn muốn liên kết tập lệnh của mình (ví dụ với npm link), mọi thứ trở nên phức tạp hơn khi chế độ tập lệnh ts-nodekhông (chưa?) Theo các liên kết tượng trưng. Tôi đã đi với #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsoncuối cùng trong trường hợp của tôi.
Kaspar Etter

0

Chỉ trong trường hợp bất cứ ai điên rồ như tôi và muốn chạy tập lệnh typcript như thể đó là tập lệnh .js, bạn có thể thử điều này. Tôi đã viết một tập lệnh hacky xuất hiện để thực thi tập lệnh .ts bằng nút.

#!/usr/bin/env bash

NODEPATH="$HOME/.nvm/versions/node/v8.11.3/bin" # set path to your node/tsc

export TSC="$NODEPATH/tsc"
export NODE="$NODEPATH/node"

TSCFILE=$1 # only parameter is the name of the ts file you created.

function show_usage() {
    echo "ts2node [ts file]"
    exit 0
}

if [ "$TSCFILE" == "" ]
then
    show_usage;
fi

JSFILE="$(echo $TSCFILE|cut -d"." -f 1).js"

$TSC $TSCFILE && $NODE $JSFILE

Bạn có thể làm điều này hoặc tự viết nhưng về cơ bản, nó tạo tệp .js và sau đó sử dụng nút để chạy nó như vậy:

# tsrun myscript.ts

Đơn giản. Chỉ cần đảm bảo rằng tập lệnh của bạn chỉ có một "." nếu không, bạn sẽ cần thay đổi JSFILE theo cách khác với những gì tôi đã thể hiện.


0
  1. Cài đặt ts-nodemô-đun nút trên toàn cầu.
  2. Tạo cấu hình thời gian chạy nút (cho IDE) hoặc sử dụng nodetrong dòng lệnh để chạy bên dưới tệp jstệp (Đường dẫn dành cho windows, nhưng bạn cũng có thể làm điều đó cho linux) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Đưa ra tsđường dẫn tệp của bạn dưới dạng đối số dòng lệnh.
  4. Chạy hoặc gỡ lỗi như bạn muốn.

0

Đối với các môi trường như Webstorm nơi nodelệnh không thể thay đổi thành ts-nodehoặc npx:

  1. npm install ts-node typescript (Cài đặt phụ thuộc)
  2. node --require ts-node/register src/foo.ts(Thêm --require ts-node/registervào "Tham số nút")

-28

Câu hỏi này đã được đăng vào năm 2015. Năm 2018, nút nhận ra cả .js.ts . Vì vậy, chạy node file.tscũng sẽ chạy.


19
Node diễn giải bất kỳ tệp nào dưới dạng javascript, vì vậy nó sẽ chỉ hoạt động nếu tệp bản thảo được đề cập là chính tệp javascript hợp lệ.
Preda7or

Điều này sẽ hoạt động nếu nội dung tệp là javascript hợp lệ nhưng phần mở rộng là ts. Nút không quan tâm phần mở rộng là gì, miễn là nội dung là javascript hợp lệ.
SnnSnn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.