DANH MỤC TÀI LIỆU
Một số mẹo và thủ thuật TypeScript
M t s m o và th thu t TypeScriptộ ố
Tip 1. TypeScript & DOM
Khi b n b t đ u s d ng Typescript, b n s nh n th y nó khá thông minh ử ụ
khi làm vi c v i môi tr ng trình duy t. Gi s , mu n tìm ph n ườ ả ử
t <input> trên trang:
const textEl = document.querySelector('inpot');
console.log(textEl.value);
// Property 'value' does not exist on type 'Element'.
TypeScript th y l i, b i vì có m t l i syntax trong ph ng ộ ỗ ươ
th c querySelector, thay vì "input" tôi đang tìm ki m m t "inpot".ế ộ
Làm th nào nó bi t đi u đó? Câu tr l i n m trong t pế ế ả ờ lib.dom.d.ts, m t
ph n c a th vi n TypeScript và, v c b n, nó mô t m i th i t ng, ư ề ơ ượ
hàm, s ki n) x y ra trên trình duy t. M t ph n c a đ nh nghĩa này là giao ự ệ
di n đ c s d ng trong cách g i c a ph ng th c ượ ươ querySelectorvà ánh x
các chu i ký t c th (nh "div," "table" ho c "input") cho các lo i ph n ự ụ ư
th HTML t ng ng: ươ ứ
interface HTMLElementTagNameMap {
"a": HTMLAnchorElement;
"abbr": HTMLElement;
"address": HTMLElement;
"applet": HTMLAppletElement;
"area": HTMLAreaElement;
"article": HTMLElement;
/* ... */
"input": HTMLInputElement;
/* ... */
}
Nó không ph i là m t gi i pháp hoàn h o b i vì nó ch làm vi c v i ệ ớ
các selectors c b n, nh ng v n t t h n là không có gì, đúng ko nào.ơ ả ư ơ
M t ví d khác v hành viộ ụ TypeScript "thông minh" này là khi b n làm vi c ạ ệ
v i các s ki n c a trình duy t: ự ệ
textEl.addEventListener('click', e => {
console.log(e.clientX);
});
.clientX trong ví d trên không ph i là m t thu c tính có s n trên b t kỳ s ộ ộ
ki n nào - nó ch có s n trên ỉ ẵ MouseEvent c th . Và TypeScript đã tìm ra ụ ể
lo i s ki n d a trên "click" đó là đ i s đ u tiên trong ph ng ố ầ ươ
th c addEventListener.
Tip 2. Expect Generics
Vì v y, thay vì ch n m t element, b n có th s d ng b t kỳ đi u gì khác: ể ử
document.querySelector('input.action');
thì HTMLElementtagNameMap s không h u ích,TypeScipt s ch tr ỉ ả
v m t ki u Element c b n. ơ ả
Nh v iư querySelector, th ng là tr ng h p m t hàm có th tr v các ườ ườ ả ề
c u trúc khác nhau và không th cho TypeScript xác đ nh s là cái nào. ị ẽ
Trong tr ng h p đó, b n có th mong đ i khá nhi u, hàm đó nói chung ườ ợ
cũng là m t generic và b n có th cung c p ki u tr v đó trong m t cú ả ề
pháp chung thu n ti n:ậ ệ
textEl = document.querySelector<HTMLInputElement>('input.action');
console.log(textEl.value);
// 'value' is available because we've instructed TS
// about the type the 'querySelector' function works with.
Tip 3. “Did we really find it?”
Ph ng th cươ document.querySelector(...) không ph i lúc nào cũng tr v ả ề
cho chúng ta m t đ i t ng. Ph n t v i b tìm ki m đó có th không n mộ ố ượ ầ ử ớ ộ ế
trên trang - và thay vì tr v m t đ i t ng thì hàm đó s tr vả ề ượ ả ề null. Và khi
b n c g ng truy c p vào nó, thu c tính .value có th không ph i là t t c ố ắ
nh ng gì đ c l u nh m c đ nh. ượ ư ư
Theo m c đ nh, trình ki m tra xem xét vi c vi c gánặ ị null và undefined cho
t ng type khác nhau. B n có th làm đi u này an toàn h n và h n ch hành ơ ạ ế
vi này b ng cách thêm ki m tra null trong tsconfig.json:
{
"compilerOptions": {
"strictNullChecks": true
}
}
V i thi t l p đó, ế ậ TypeScript bây gi sờ ẽ complain n u b n c g ng truy c p ế ố ắ
thu c tính trên m t đ i t ng có th ố ượ null và b n s ph i "reassure" nó vạ ẽ
s t n t i c a đ i t ng, ví d : b ng cách gói ph n đó v i đi u ki nự ồ ượ if
(textE1) {...}
Khác v i querySelector, tr ng h p ph bi n khác cho đi u này là ph ng ườ ợ ổ ế ươ
th c Array.find - k t qu tr v th ế ả ề undefinded.
Không ph i đi u gì b n mu n tìm ki m nó cũng s nhé!!!.ả ề ế
Tip 4. “I’m telling you, TS, it is there!”
Nh chúng ta đã thi t l p, v i vi c ki m tra ch t ch , TypeScript s ư ế ậ
nhi u hoài nghi h n v giá tr c a chúng ta. M c khác, đôi khi b n ch bi t ơ ị ủ ế
t bên ngoài có nghĩa là giá tr s đ c thi t l p. Trong nh ng tr ng h p ị ẽ ượ ế ườ
ngo i l nh v y, b n có th s d ng "post-fix expression operator" (hay ư ể ử
nói cách d hi u là d u !):ễ ệ
const textEl = document.querySelector('input');
console.log(textEl!.value);
// with "!" we assure TypeScript
// that 'textEl' is not null/undefined
Tip 5. When migrating to TS…
Thông th ng, khi b n có m t codebase cũ mà b n mu n chuy n sang ườ ạ ố
TypeScript, m t trong nh ng đi u m t khá nhi u time là làm cho code cũ ề ấ
tuân th các quy t c TSLint c a b n. Nh ng gì b n có th làm là ch nh s a ủ ạ
t t c các t p b ng cách thêmấ ả
// tslint:disable
trong dòng đ u tiên c a m i dòng, đ TSLint không ki m tra chúng. Sau đó, ủ ỗ
ch khi m t developer làm vi c trên m t t p c th , anh ta s b t đ u b ng ẽ ắ
cách xóa dòng này và s a t t c các l i linting ch trong t p đó. B ng cách ỉ ệ
này, chúng ta không c n làm m t cu c cách m ng mà ch là m t s c i ti n ự ả ế
- và các codebase d n d n an toàn và đ c c i thi n. ượ ả
Đ thêm các types v i vào mã JS cũ, đây ch c là đi u mà b n không th ng ắ ề ườ
xuyên làm. Suy lu n ki u c a TypeScript s x lý nó và ch khi b n có m t ẽ ử
s mã khó, ví d : ch đ nh lo i giá tr khác nhau cho cùng m t bi n thì b n ỉ ị ế
có th g p v n đ . N u tái c u trúc mà không ph i là m t v n đ t m ế ề ầ
th ng b n có th gi i quy t b ng cách s d ngườ ể ả ế ằ any:
let mything = 2;
mything = 'hi';
// Type '"hi"' is not assignable to type 'number'
mything = 'hi' as any;
// if you say "any", TypeScript says ¯\_()_/¯
Nh ng th c s , nó nh m t ph ng sách cu i cùng. Chúng tôi không ư ự ự ư ươ
khuy n khích vi c dùngế any trong TypeScript.
Tip 6. More type restrictions
Đôi khi TypeScript không th suy ra type. Tr ng h p ph bi n nh t là ườ ổ ế
tham s hàm:
function fn(param) {
console.log(param);
}
Trong n i b nó c n đ c gán m t s type cho params đây. Vì mu n gi i ượ ộ ố
h n s l ng ố ượ any đ n m c t i thi u tuy t đ i, nên th ng s h n ch ế ườ ẽ ạ ế
hành vi đó b ng cài đ t tsconfig.json:
{
"compilerOptions": {
"noImplicitAny": true
}
}
Th t không may, chúng ta không th đ t lo i dây an toàn đó (yêu c u nh p ể ặ
rõ ràng) trên function tr v type. Vì v y, n u thay vào đó ch c năng ả ề ế
fn(param): string { Tôi s quên ki u đó function fn(param) {), TypeScript s ẽ ể
không theo dõi nh ng gì tôi tr v , ho c th m chí n u tôi tr v b t c th ả ề ế ả ề ấ
gì t hàm đó. Chính xác h n: nó s ph ng đoán giá tr tr v t b t kỳ giá ơ ề ừ
tr nào b n đã tr l i ho c không tr l i. ả ạ ả ạ
R t may m n đó là n i ơ TSLint tr giúp. V i quy t c typedef b n có th ạ ể
th c t o ra hình th c tr v cho hàm: ả ề
{
"rules": {
"typedef": [
true,
"call-signature"
]
}
}
Tip 7. Type Guards
thông tin tài liệu
Khi bạn bắt đầu sử dụng Typescript, bạn sẽ nhận thấy nó khá thông minh khi làm việc với môi trường trình duyệt
Mở rộng để xem thêm
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×