JavaScript sẽ bao giờ có các loại?

Có vẻ như mọi bài báo ngày nay đều khuyến khích chúng ta sử dụng TypeScript. Mặc dù TypeScript có vẻ như đối với một số nhà phát triển JavaScript như một khái niệm thích hợp ngay từ đầu, nhưng nó chắc chắn đã trở nên phổ biến và có ảnh hưởng. Vì vậy, bạn có thể tự hỏi liệu có đáng để tham gia chuyến đào tạo cường điệu về TypeScript hay không 🚂

Tin tốt là bạn không cần phải học hàng triệu khái niệm mới để kiểm tra TypeScript và xem nó có phù hợp với bạn không. Phần lớn TypeScript trông giống như JavaScript, vì vậy bạn sẽ thấy phần lớn nó có thể hiểu được nếu bạn đã quen thuộc với JavaScript

Trong bài viết này, tôi sẽ so sánh cách TypeScript sẽ thay đổi các cơ sở mã JavaScript hiện có để hiểu cú pháp bổ sung nào bạn có thể phải học để hiểu TypeScript. Tôi sẽ cố gắng duy trì sự tập trung rộng hơn vào các khái niệm cú pháp chính, thay vì buộc lời giải thích của tôi vào một khung hoặc loại mã duy nhất

Thông qua quá trình này, tôi sẽ giải thích các lợi ích của TypeScript và khi tôi nghĩ rằng nó đáng để thêm vào một dự án. Theo kinh nghiệm của tôi, TypeScript đặc biệt hữu ích cho các dự án lớn hơn, nơi việc xác định một “lỗi nhà phát triển” nhỏ [như lỗi đánh máy hoặc trường hợp cạnh] có thể trở nên tốn thời gian và khó khăn

Tôi cũng sẽ giải quyết các khuyết điểm của TypeScript. Đối với tất cả sự cường điệu của nó, TypeScript không phải là một công cụ nhanh/mới mà thay vào đó, làm cho việc viết JavaScript chậm hơn và có phương pháp hơn, điều này có thể giúp chuẩn hóa mã và ngăn ngừa các lỗi phổ biến. Tuy nhiên, mặt khác, TypeScript đơn giản là không xứng đáng với một số dự án nhỏ hơn hoặc nếu dự án không phù hợp với kiểu gõ tĩnh. Và, có thể không đáng để thêm TypeScript vào một dự án nếu bạn muốn bao gồm nhiều nhà phát triển cơ sở hơn, những người có thể gặp khó khăn hơn trong việc chọn nó

Bất chấp điều đó, tôi nghĩ rằng sự quen thuộc với TypeScript có thể giúp chúng ta viết JavaScript tốt hơn và có những “điểm giữa” [đặc biệt là JSDoc] có ý nghĩa ngay cả đối với các dự án mà TypeScript sẽ quá nặng

  1. JavaScript Doppelgänger 👬
  2. Lập trình chức năng
  3. Đối tượng, nhập bí danh và tiện ích mở rộng, Oh My
  4. Dữ liệu từ API
  5. Ưu và nhược điểm của TypeScript so với. JavaScript
  6. JSDoc. Trung địa
  7. Suy nghĩ cuối cùng

JavaScript Doppelgänger 👬

Hãy xem tệp sau đây

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
8

sao chép

const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']

Đó là một số đoạn mã khá đơn giản và… trông giống hệt như JavaScript. Nhưng, bởi vì tôi đặt một

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
9 làm phần mở rộng tệp, nên về mặt kỹ thuật, đó là TypeScript. Tuy nhiên, về mặt kỹ thuật, tôi không thể thực thi tệp này bên trong trình duyệt web, vì trình duyệt web không thể chạy TypeScript mà không biên dịch nó thành JavaScript. May mắn thay, nó không quá khó để biên dịch nó. nếu tôi chạy

const sum = [a, b] => a + b
0

Sau đó, tôi sẽ cài đặt TypeScript trên máy tính của mình. Sau đó, tôi có thể chạy

const sum = [a, b] => a + b
1

Khi tôi làm như vậy, tôi sẽ nhận được một tệp mới có tên là

const sum = [a, b] => a + b
2. Lưu ý rằng đây là một tệp JavaScript bình thường và nội dung sẽ… giống hệt nhau. Có, TypeScript và JavaScript thường trông giống hệt nhau

Sự khác biệt thực sự duy nhất sẽ là đằng sau hậu trường. JavaScript không thực sự biết trước rằng các biến

const sum = [a, b] => a + b
3 và
const sum = [a, b] => a + b
4 là các số. Mặt khác, TypeScript thì có và nó sẽ báo lỗi trình biên dịch nếu tôi cố làm những việc không thể. Lưu ý rằng cờ
const sum = [a, b] => a + b
5 đảm bảo rằng TypeScript sẽ phát sinh lỗi nếu tôi mắc lỗi nhập

Giả sử tôi có một tệp như thế này

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];

Trong JavaScript, tôi sẽ gặp lỗi khi cố chạy đoạn mã này, bởi vì thực sự không có cách nào để nhân một chuỗi một đối tượng với nhau. Nhưng, trong TypeScript, tôi sẽ gặp lỗi khi cố gắng biên dịch mã này thành JavaScript [

const sum = [a, b] => a + b
6]. Kết quả là, tôi có thể ngăn chặn bất kỳ lỗi liên quan đến loại nào xâm nhập vào dự án của mình mà không cần phải chạy mã

Nhưng, làm thế nào mà TypeScript biết được loại của từng biến của tôi? . Khi tôi nói

const sum = [a, b] => a + b
7, nó biết
const sum = [a, b] => a + b
3 là một số vì giá trị tôi đã gán cho nó. Vì vậy, khi viết một “tập lệnh” [một vài dòng mã không sử dụng các hàm], trình biên dịch TypeScript có thể hữu ích trong việc ngăn ngừa lỗi, nhưng mã của chúng ta thường trông giống hệt nhau giữa TypeScript và JavaScript

Lập trình chức năng

Tuy nhiên, đôi khi, trình biên dịch TypeScript sẽ không thể tự động suy ra loại biến. Điều này đặc biệt xảy ra khi làm việc với các chức năng. Và, nếu bạn đã từng viết JavaScript……. bạn đã viết các hàm 💪

Lấy ví dụ một chức năng đơn giản như thế này

sao chép

const sum = [a, b] => a + b

Trừ khi chúng ta nói rõ ràng với trình biên dịch TypeScript, nó sẽ không có cách nào biết rằng các tham số

const sum = [a, b] => a + b
9 và
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
50 phải là số, cũng như hàm
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
51 sẽ trả về một số. Do đó, hai tham số tự động có một loại mà TypeScript gọi là
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
52

Nói chung, việc có các tham số chức năng hoặc giá trị trả về với loại

const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
52 là không tốt vì chúng ta có thể nhận được kết quả không mong muốn nếu mắc lỗi trong quá trình viết mã. Ví dụ: ngay bây giờ,
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
54 sẽ trả về
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
55, điều mà tôi có thể không mong đợi nếu hàm
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
51 chỉ được mong đợi lấy các số làm đối số. Vì vậy, trong TypeScript, tôi nên đánh dấu các loại đối số bằng cách sử dụng toán tử
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
57 như vậy

sao chép

const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
5

Bằng cách này, nếu tôi thử chạy

const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
54, trình biên dịch sẽ phàn nàn rằng hàm không thể nhận đối số chuỗi. Trong trường hợp này, tôi thực sự không phải nêu loại giá trị trả về vì TypeScript rất thông minh và sẽ diễn giải rằng một số được thêm vào một số luôn là một số. Tuy nhiên, theo nguyên tắc chung, tôi khuyên bạn nên luôn luôn đánh dấu các giá trị trả về, kể từ đó nếu tôi mắc lỗi khi mã hóa và vô tình viết một hàm trả về sai kiểu, TypeScript sẽ cho tôi biết. Khi tôi đánh dấu giá trị trả về lên, chức năng của tôi sẽ giống như

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
5

Typescript bao gồm nhiều loại cơ bản

  • const age = 35
    const votingAge = 18
    
    if [age > votingAge] console.log['You can vote!']
    59
  • const firstName = "Mary";
    const info = { age: 25, occupation: "Coder" };
    
    console.log[firstName * info];
    50
  • const firstName = "Mary";
    const info = { age: 25, occupation: "Coder" };
    
    console.log[firstName * info];
    51
  • đoàn thể. bạn có thể nói một biến có thể nhận nhiều hơn một loại bằng cách sử dụng toán tử “union” như
    const firstName = "Mary";
    const info = { age: 25, occupation: "Coder" };
    
    console.log[firstName * info];
    52
  • Mảng. Bạn cũng có thể nói rằng một biến sẽ lấy một mảng có kiểu nhất định bằng cách viết _____253 sau kiểu như ____ ____

Tôi cũng nên đề cập rằng bạn có thể xác định các biến như

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
55, nhưng nói chung là không cần thiết, vì TypeScript có thể suy ra loại đó một cách dễ dàng

Luôn đi đầu trong phát triển với thử thách mã hóa hàng tháng

Khám phá công nghệ mới với một thử thách mã hóa thú vị, có dàn dựng, xuất hiện trong hộp thư đến của bạn mỗi tháng một lần. Bạn sẽ nhận được tất cả các kiến ​​thức với tối thiểu spin-up

Địa chỉ email

Điều khoản bảo vệ

Một trong những điều chính về các chức năng mà tôi thấy cuối cùng sẽ thay đổi khi tôi sử dụng TypeScript là tôi sẽ viết nhiều câu lệnh

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
56 hơn. Như một ví dụ, nếu tôi có một chức năng như

sao chép

const sum = [a, b] => a + b
4

Nếu tôi thử biên dịch, TypeScript sẽ phàn nàn vì

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
57 có thể là
const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
58 và
const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
58 không có chức năng
const sum = [a, b] => a + b
40, vì vậy tôi có thể gặp lỗi. Tôi có thể sửa lỗi bằng cách viết một câu lệnh
const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
56

sao chép

const sum = [a, b] => a + b
0

Nói chung, kiểm tra tất cả các trường hợp cạnh có thể xảy ra là một cách thực hành tốt và việc viết các “mệnh đề bảo vệ” như vậy là điều mà hầu hết các nhà phát triển JavaScript đều làm.

Nhưng, không giống như JavaScript, với TypeScript, tôi thực sự sẽ thấy lỗi khi biên dịch nếu tôi quên tính đến một trường hợp cạnh cụ thể. Vì vậy, tôi thường kết thúc với các mệnh đề bảo vệ moar khi sử dụng TypeScript vì tôi hiểu rõ hơn về tất cả các trường hợp cạnh có thể xảy ra và điều đó có nghĩa là mã của tôi dễ bảo trì và dễ hiểu hơn 😽

Đối tượng, nhập bí danh và tiện ích mở rộng, Oh My

Tuy nhiên, bạn có thể nhận thấy rằng tôi chưa đề cập đến một loại JavaScript chính. các đối tượng. Tại sao các đối tượng khác với các loại khác?

Đó là lý do tại sao, khi mong đợi một loại đối tượng, chúng ta phải rõ ràng về việc phác thảo hình dạng dự kiến ​​của nó. TypeScript hỗ trợ một vài cú pháp khác nhau cho cùng một mục đích, nhưng tôi thường thích tự khai báo một loại hơn. Bí danh loại là loại mà tôi [với tư cách là nhà phát triển] xác định có thể liệt kê các khóa và giá trị, chẳng hạn

sao chép

const sum = [a, b] => a + b
1

Sau đó, tôi có thể viết một chức năng

sao chép

const sum = [a, b] => a + b
2

Trong trường hợp này, TypeScript sẽ không báo lỗi cho tôi vì nó biết rằng người dùng phải có họ và tên dưới dạng chuỗi. Tuy nhiên, nếu tôi cố gắng nói

const sum = [a, b] => a + b
42, nó sẽ gây ra lỗi trình biên dịch cho tôi, vì người dùng không có tên đệm

Cũng cần lưu ý rằng khi tôi khai báo một biến có giá trị đối tượng, TypeScript sẽ tự động biết các thuộc tính và kiểu của nó

sao chép

const sum = [a, b] => a + b
4

Ở đây,

const sum = [a, b] => a + b
43 có loại sau

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
0

Điều đó trông giống như loại

const sum = [a, b] => a + b
44 mà tôi đã viết ở trên một cách đáng ngờ. Chắc chắn rồi, nếu tôi thử chạy
const sum = [a, b] => a + b
45 và chuyển biến đó làm đối số hàm, thì TypeScript sẽ xác nhận rằng nó phù hợp với loại
const sum = [a, b] => a + b
44. Chúng tôi không cần phải nói rõ ràng với TypeScript rằng
const sum = [a, b] => a + b
43 là một
const sum = [a, b] => a + b
44 vì loại suy luận của nó đã khớp với
const sum = [a, b] => a + b
44

Bây giờ, nếu

const sum = [a, b] => a + b
43 thiếu thuộc tính
const sum = [a, b] => a + b
01 hoặc
const sum = [a, b] => a + b
02, tôi sẽ gặp lỗi khi biên dịch

Mở rộng bí danh loại

Đôi khi bạn kết thúc với hai loại đối tượng, trong đó một loại có thêm một số phím. May mắn thay, TypeScript cho phép chúng tôi giữ mọi thứ KHÔ

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
1

Trong trường hợp này, một

const sum = [a, b] => a + b
03 sẽ chứa các khóa ________ 401, ________ 402, ________ 406 và ________ 407. Mẫu này cuối cùng hữu ích cho việc tái cấu trúc mã, nhưng nó cũng có thể hữu ích khi bạn muốn sử dụng bí danh loại từ gói bên ngoài nhưng thực hiện một số sửa đổi để phù hợp với trường hợp sử dụng của bạn

đạo cụ phản ứng

Trường hợp mà bí danh loại cuối cùng có thể hữu ích nhất là liên quan đến các đạo cụ trong các khung giao diện người dùng dựa trên thành phần vì các đạo cụ thường xuất hiện dưới dạng một đối tượng. Trong bản demo này, tôi đang cố gắng tránh tập trung vào một khung cụ thể, nhưng đáng lưu ý rằng trong React và các khung liên quan, bí danh loại rất hữu ích. Ví dụ: nếu tôi có một thành phần JavaScript như

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
2

Sau đó, trong TypeScript, tôi sẽ phải liệt kê rõ ràng những đạo cụ nào tôi muốn thành phần của mình sử dụng

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
3

Đôi khi, có thể hơi tẻ nhạt khi nói rõ ràng về mọi chỗ dựa, nhưng nó có thể ngăn tôi mắc tất cả các loại lỗi của nhà phát triển, có thể là lỗi chính tả hoặc các trường hợp cạnh không được xem xét. Kết quả là, tôi thấy rằng mã của mình cuối cùng rõ ràng hơn nhiều và bản thân TypeScript gần như là dạng tài liệu riêng về cách sử dụng thành phần đó [mặc dù, tất nhiên, không phải là sự thay thế cho các tài liệu được viết tốt. ]

Dữ liệu từ API

Tất cả các tính năng TypeScript này có vẻ đáng yêu đối với bạn cho đến nay. Bạn đã sẵn sàng để khai báo rõ ràng các kiểu trả về/tham số hàm của mình. vâng. Tuy nhiên, có một vấn đề phổ biến ở đây mà tôi thấy không được trình bày trong các tài liệu tôi đã đọc. Còn khi bạn không thực sự có quyền kiểm soát mọi thứ thì sao?

Ví dụ: nếu tôi khai báo

const sum = [a, b] => a + b
08, thì TypeScript có thể dễ dàng kiểm tra xem
const sum = [a, b] => a + b
43 có khớp với hình dạng của loại
const sum = [a, b] => a + b
44 của tôi không. Nhưng nếu tôi lấy dữ liệu của Jane từ một API bằng cách sử dụng yêu cầu
const sum = [a, b] => a + b
11 thì sao?

Có hai cách tiếp cận ở đây. Một là tôi có thể cho rằng phản hồi từ API sẽ có hình dạng như tôi mong đợi, như vậy

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
4

Toán tử

const sum = [a, b] => a + b
12 là một loại ghi đè thủ công yêu cầu TypeScript coi
const sum = [a, b] => a + b
43 là
const sum = [a, b] => a + b
44 chứ không phải
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
52, nhưng nó không thực sự kiểm tra xem khẳng định này có đúng không. Vì vậy, Bản mô tả sẽ đơn giản giả định rằng phản hồi từ yêu cầu khớp chính xác với hình dạng của loại của chúng tôi. Tuy nhiên, điều này có thể không phải lúc nào cũng đúng, tùy thuộc vào cách API phản hồi

Thành thật mà nói, tôi nghĩ rằng sử dụng

const sum = [a, b] => a + b
12 có nghĩa là chúng tôi nhận được ít lợi ích hơn nhiều từ việc sử dụng TypeScript. Chúng tôi chưa thực sự kiểm tra xem yêu cầu API có thực sự mang lại cho chúng tôi phản hồi phù hợp với loại của chúng tôi hay không, vì vậy chúng tôi cũng chưa tính đến bất kỳ lỗi tiềm ẩn nào nếu không.

Kết quả là, cách tiếp cận mà tôi thường thực hiện là viết một hàm được gọi là vị từ kiểu. Trong loại chức năng này, chúng tôi sử dụng JavaScript tiêu chuẩn để chuyển đổi bất kỳ đối tượng nào chúng tôi nhận được [thuộc loại

const sum = [a, b] => a + b
17, là loại của TypeScript khi chúng tôi thực sự không có thông tin về đầu vào] sang định dạng phù hợp với loại của chúng tôi. như một ví dụ

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
5

Sau đó, chúng ta có thể chạy

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
6

Có nhiều tính năng thú vị hơn trong TypeScript, nhưng tôi nghĩ điều này bao gồm những điều cơ bản. Nói chung, nếu bạn biết JavaScript, bạn chỉ cần thêm chú thích kiểu là có TypeScript

Một ngoại lệ không đặc biệt quan trọng mà tôi cần nhanh chóng lưu ý là loại Enum, đây là phần bổ sung cho ngôn ngữ bao gồm các tính năng vốn không có trong JavaScript. Loại enum cho phép bạn lưu trữ một giá trị chỉ có thể có một phạm vi tùy chọn hạn chế [ví dụ: “đã lưu”, “đang tải” và “lỗi”]. Tuy nhiên, hành vi tương tự luôn có thể được thực hiện bằng chuỗi hoặc số nguyên trong JavaScript thông thường, vì vậy không thực sự cần thiết phải sử dụng enums trừ khi bạn thích cú pháp

Ưu và nhược điểm của TypeScript so với. JavaScript

Khi nào thì TypeScript thực sự hữu ích?

Vì vậy, bây giờ bạn đã quen thuộc với những điều cơ bản của TypeScript. Nhưng khi nào nó có ý nghĩa để sử dụng nó?

  • dự án lớn. Nói một cách đơn giản, khi bạn đang xử lý một số lượng lớn các tệp và tính năng, rất dễ để một lỗi nhỏ bị chôn vùi ở đâu đó trong một cơ sở mã khổng lồ. TypeScript thực sự rất giỏi trong việc phát hiện các loại lỗi này. Cùng với kiểm thử tự động, nó có thể giúp chúng tôi đảm bảo tính ổn định của một cơ sở mã lớn
  • Dữ liệu phức tạp. Một dự án không nhất thiết phải lớn mới phức tạp. Nếu một dự án xử lý một số loại dữ liệu phức tạp [i. e. , yêu cầu một bảng cơ sở dữ liệu có nhiều cột], thì tôi nhận thấy rằng TypeScript giúp tôi theo dõi mọi thứ. TypeScript cũng giúp ghi lại các đầu vào và đầu ra dự kiến ​​của mọi chức năng, giúp các nhà phát triển khác dễ dàng tham gia vào một dự án có độ phức tạp cao
  • khả năng tiếp cận. Khi sử dụng TypeScript để phát triển giao diện người dùng, TypeScript có thể giúp xác định các lỗi trợ năng phổ biến, chẳng hạn như quên văn bản
    const sum = [a, b] => a + b
    18 trên hình ảnh. [Xem loạt bài gồm 3 phần của tôi về khả năng truy cập trong Tiếp theo. js để biết thêm. ]
  • Tài liệu. TypeScript không thay thế việc viết tài liệu tốt. Nhưng điều đó có nghĩa là mọi hàm sẽ có các loại tham số và giá trị trả về được ghi lại. Các trình soạn thảo văn bản hiện đại như VSCode và Neovim thậm chí có thể hiển thị thông tin này khi bạn nhập. Hơn nữa, TSDoc cung cấp một tiêu chuẩn để viết tài liệu trong TypeScript. Vì vậy, đối với các dự án mà sự cộng tác là quan trọng, TypeScript có thể giúp quy định cách mọi người viết mã để dễ hiểu hơn trong nhóm
  • giảm lỗi. Đối với một số dự án, lỗi là không thể chấp nhận được. Ví dụ: nếu chúng tôi đang xử lý dữ liệu nhạy cảm như tài khoản ngân hàng. Trong những trường hợp này, ngay cả khi TypeScript không thay thế kiểm tra tự động, nó có thể giúp ngăn ngừa lỗi của nhà phát triển và tính đến các trường hợp cạnh mà chúng tôi có thể quên kiểm tra. Vì vậy, nó thường có giá trị khi lỗi không được phép

Về bản chất, tôi nghĩ TypeScript đặc biệt hữu ích trong việc ngăn chặn “lỗi của nhà phát triển”, chẳng hạn như lỗi chính tả hoặc các trường hợp cạnh mà chúng ta có thể không lường trước được. Cơ sở mã của chúng tôi càng lớn, càng phức tạp hoặc cực kỳ quan trọng thì TypeScript càng có thể giúp chúng tôi xác định lỗi của nhà phát triển

Khi nào TypeScript là một nỗi đau?

  • dự án nhỏ. Nếu bạn chỉ đang xây dựng một cái gì đó nhỏ và đơn giản, TypeScript có thể không giúp được gì nhiều. Chi phí bổ sung để thêm trình biên dịch TypeScript có lẽ không đáng. Đôi khi, việc thiết lập và sửa lỗi TypeScript mất nhiều thời gian hơn là giải quyết bất kỳ lỗi JavaScript nào
  • Đã thêm độ phức tạp. Trình duyệt không thể chạy trực tiếp TypeScript. Vì vậy, nếu bạn dự định sử dụng nó để phát triển giao diện người dùng, thì có thể bạn sẽ cần sử dụng webpack hoặc một gói tương tự để biên dịch nội dung của mình. Nếu bạn không sao nếu chỉ sử dụng vanilla JavaScript, bước thiết lập bổ sung này có thể không cần thiết
  • Sự hợp tác. Thêm TypeScript giới thiệu một lớp kiến ​​thức bổ sung mà các nhà phát triển khác sẽ cần phải cộng tác trong dự án. Nhiều nhà phát triển đã biết nó và các nhà phát triển JavaScript có kinh nghiệm sẽ dễ dàng chọn nó. Tuy nhiên, nếu bạn muốn làm cho dự án của mình có thể tiếp cận được đối với nhà phát triển cơ sở, thì TypeScript có thể làm giảm khả năng đọc của mã đối với người mới bắt đầu
  • gõ vịt. Một số loại lập trình meta thực sự có thể tận dụng các loại linh hoạt của JavaScript và TypeScript có thể khiến việc này trở nên khó khăn hơn. Chắc chắn không phải là không thể lập trình siêu dữ liệu với TypeScript, nhưng nó có thể còn phức tạp hơn JavaScript và yêu cầu các cách giải quyết kỳ lạ

Gõ vịt là gì?

Gõ vịt đề cập đến khái niệm rằng nếu nó đi như một con vịt và kêu như một con vịt, thì đó là một con vịt. ” Ví dụ: trong JavaScript, bạn có thể sử dụng toán tử

const sum = [a, b] => a + b
19 để thêm số nhưng bạn cũng có thể sử dụng toán tử tương tự với chuỗi. Vì vậy, chúng ta có thể viết các biểu thức phù hợp với cả hai loại 🦆

gói cũ. Thông thường các gói NPM hỗ trợ TypeScript khá tốt, nhưng khi chúng không hỗ trợ thì thật tệ. 🤯 Tôi đã gặp một vài trường hợp trong đó một gói tuyên bố rằng nó hỗ trợ TypeScript, nhưng thực ra gói đó có một số lỗi khó hiểu liên quan đến TypeScript ẩn sâu bên trong gói. Kết quả là, tôi đã lãng phí rất nhiều thời gian để giải quyết những vấn đề không thực sự tồn tại. Nếu một gói được duy trì liên tục và được sử dụng rộng rãi, bạn sẽ ổn thôi. Nhưng nếu đó là một gói cũ hơn với nhu cầu/hỗ trợ tối thiểu của cộng đồng, thì những điều kỳ lạ có thể và sẽ xảy ra

JSDoc. Trung địa

Vì vậy, bạn nên làm gì nếu bạn quyết định rằng nhược điểm nhiều hơn ưu điểm? . Tất nhiên, tôi nên đề cập rằng TypeScript không phải là tất cả hoặc không có gì. Đặc biệt nếu bạn đang sử dụng một gói như webpack, bạn có thể nhập các tệp TypeScript trong một dự án giống như khi chúng ở bất kỳ định dạng nào khác

Tuy nhiên, giả sử bạn không sử dụng trình đóng gói và bạn không muốn giới thiệu tất cả chi phí chung để bao gồm TypeScript. May mắn thay, có một giải pháp “trung bình” cho phép bạn tận dụng nhiều lợi ích của TypeScript với một số nhược điểm. JSDoc

JSDoc là một cách chuẩn hóa để viết nhận xét trong JavaScript của bạn, chủ yếu được sử dụng để ghi lại các hàm hoặc lớp. Nó hoạt động hoàn toàn với các nhận xét JavaScript tiêu chuẩn, vì vậy không cần trình biên dịch hoặc thực sự bất kỳ chi phí kỹ thuật nào. Nó bao gồm một số "thẻ khối" đặc biệt với các ký hiệu

const sum = [a, b] => a + b
20 ở phía trước chúng, bao gồm
const sum = [a, b] => a + b
21 và
const sum = [a, b] => a + b
22, vì vậy hàm
const age = 35
const votingAge = 18

if [age > votingAge] console.log['You can vote!']
51 của chúng ta trước đây sẽ trông như thế nào

sao chép

const firstName = "Mary";
const info = { age: 25, occupation: "Coder" };

console.log[firstName * info];
7

Hơn nữa, tôi thích sử dụng JSDoc vì nó cho phép chúng tôi sử dụng lệnh đầu cuối mới

const sum = [a, b] => a + b
24 [giả sử chức năng của chúng tôi được lưu trong tệp
const sum = [a, b] => a + b
25], tệp này sẽ tạo ra một trang web đẹp mắt với tất cả tài liệu của chúng tôi được định dạng độc đáo. Vì vậy, khi tôi làm việc trong các dự án lớn hơn, tôi cố gắng ghi lại mọi chức năng và sau đó tạo một trang web tập trung cho tất cả tài liệu

JSDoc cung cấp các lợi ích ngoài việc khuyến khích bạn viết tài liệu tốt. trình soạn thảo văn bản thường có thể tích hợp với JSDoc và hiển thị cho bạn tài liệu của bạn khi bạn đang nhập

Tuy nhiên, bạn sẽ không nhận được các tính năng “nâng cao hơn” của TypeScript. Ví dụ: vì không có trình biên dịch nào tham gia nên bạn sẽ không được cảnh báo về lỗi nhập mã. Bạn cũng sẽ không nhận được các toán tử dành riêng cho TypeScript như

const sum = [a, b] => a + b
12 hoặc khả năng khai báo các bí danh loại [mặc dù bạn có thể ghi lại các khóa của loại
const sum = [a, b] => a + b
27 thông qua quá trình hủy]

Điều đáng chú ý là cũng có một tiêu chuẩn gọi là TSDoc, tiêu chuẩn này cũng giống như vậy nếu bạn đang làm việc với TypeScript

Bạn cũng nên kiểm tra

  • Kế tiếp. Hướng dẫn SEO js. Hãy thử một dự án nhanh với các tối ưu hóa chính

    Kế tiếp. Hướng dẫn SEO js. Hãy thử một dự án nhanh với các tối ưu hóa chính

Suy nghĩ cuối cùng

Nếu bạn đã quen thuộc với JavaScript, TypeScript sẽ trông quen thuộc. Trên thực tế, đôi khi cả hai sẽ trông giống hệt nhau. Mặt khác, TypeScript sẽ yêu cầu chúng tôi thêm một số chú thích loại vào mã của chúng tôi, đặc biệt là các tham số chức năng xung quanh và giá trị trả về. Mặc dù nó chắc chắn đòi hỏi phải học một chút, nhưng nó không phức tạp như học một ngôn ngữ hoàn toàn mới và nó có rất nhiều lợi ích

Đối với các dự án lớn hoặc dự án có dữ liệu phức tạp, TypeScript có thể giúp ngăn ngừa lỗi của nhà phát triển. Nếu tôi viết sai chính tả một biến hoặc quên bao gồm văn bản

const sum = [a, b] => a + b
18, TypeScript có thể tìm ra vấn đề ngay lập tức. Vì vậy, khi cơ sở mã lớn hơn, nó có thể tiết kiệm thời gian dành cho việc gỡ lỗi

Tuy nhiên, trong các cơ sở mã nhỏ hơn, việc bao gồm TypeScript có thể đơn giản là quá mức cần thiết. Có thể không cần thiết phải giới thiệu trình biên dịch và mức độ phức tạp kỹ thuật hoàn toàn mới. Nói như vậy, có thể đạt được một số lợi ích của TypeScript bằng cách dựa vào JSDoc. Mặc dù JSDoc không thể cung cấp cho chúng ta tất cả sức mạnh của TypeScript, nhưng nói chung đây là một cách tuyệt vời để viết tài liệu và nó cung cấp một số lợi ích mà hầu như không có nhược điểm nào

Và, ngay cả khi cá nhân bạn không sử dụng TypeScript nhiều như vậy, tôi nghĩ bạn nên biết và tốt cho hệ sinh thái. Lần tới khi bạn cài đặt gói NPM được tích hợp trong TypeScript, bạn có thể nhận thấy rằng trình soạn thảo văn bản của bạn sẽ tự động biết bạn đang sử dụng chức năng nào và cần sử dụng đối số nào. Loại chức năng dành cho nhà phát triển này hữu ích ngay cả trong các dự án JavaScript đơn giản 🚀

Alexander Dubovoy

Xuất thân từ Khu vực Vịnh San Francisco, Alexander Dubovoy là một lập trình viên và nhạc sĩ có trụ sở tại Berlin. Anh ấy tốt nghiệp Đại học Yale vào tháng 5 năm 2016, nơi anh ấy đã viết một luận văn đoạt giải về lịch sử nhạc jazz ở Liên Xô. Kể từ khi tốt nghiệp, anh ấy đã làm việc như một nhà phát triển web tự do. Anh ấy giảng dạy tại Le Wagon, một bootcamp mã hóa quốc tế và thích giúp đỡ sinh viên giải quyết các vấn đề kỹ thuật khó. Anh ấy cũng quản lý một lịch trình biểu diễn tích cực với tư cách là một nhạc sĩ ngẫu hứng. Anh ấy thích kết hợp niềm đam mê của mình với công nghệ và âm nhạc, đặc biệt là thông qua công việc của anh ấy tại Groupmuse, một tổ chức hợp tác trình bày buổi hòa nhạc

JavaScript sẽ thực hiện các loại?

Javascript sẽ vẫn là ngôn ngữ được nhập động, nhưng nó sẽ chấp nhận khai báo kiểu nguyên bản . Thông số kỹ thuật này vẫn là giai đoạn 1, vì vậy nhiều thứ có thể thay đổi - nhưng đây là thời điểm thú vị để Javascript thực hiện bước đầu tiên trong một thế giới được gõ mạnh hơn.

Tại sao JavaScript không có các loại?

JavaScript có bảy loại dựng sẵn. null , không xác định , boolean , số , chuỗi , đối tượng và ký hiệu. Chúng có thể được xác định bởi toán tử typeof. Biến không có loại nhưng giá trị trong biến thì có . Các loại này xác định hành vi nội tại của các giá trị.

Bản thảo có phải là tương lai không?

Vì ngôn ngữ lập trình đã nhập này được thiết kế để hoạt động với JS nên nó sẽ không bao giờ thay thế JavaScript. Nó sẽ luôn xây dựng trên JS như một nền tảng vững chắc. TypeScript dự kiến ​​sẽ tiếp tục phát triển phổ biến trong tương lai gần vì nó mang lại nhiều lợi ích cho các nhà phát triển.

JS có bao nhiêu loại?

Trong Javascript, có năm loại dữ liệu cơ bản hoặc nguyên thủy . Năm loại dữ liệu cơ bản nhất là chuỗi, số, booleans, không xác định và null. Chúng tôi gọi đây là các kiểu dữ liệu nguyên thủy.

Chủ Đề