function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
Sử dụng vị từ kiểu "test is string" ở định dạng trên (thay vì chỉ sử dụng boolean cho kiểu trả về, sau khi isString () được gọi, nếu hàm trả về true, TypeScript sẽ thu hẹp kiểu thành chuỗi trong bất kỳ khối nào được bảo vệ bởi a gọi hàm.
Trình biên dịch sẽ nghĩ rằng foo là chuỗi trong khối được bảo vệ bên dưới (và CHỈ trong khối được bảo vệ bên dưới)
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
Vị từ loại chỉ được sử dụng trong thời gian biên dịch. Kết quả tệp .js (thời gian chạy) sẽ không có sự khác biệt vì nó không xem xét TYPE.
Tôi sẽ minh họa sự khác biệt trong bốn ví dụ dưới đây.
Vd 1: đoạn mã ví dụ trên sẽ không có lỗi biên dịch và lỗi thời gian chạy.
Ví dụ 2: mã ví dụ dưới đây sẽ có lỗi biên dịch (cũng như lỗi thời gian chạy) vì TypeScript đã thu hẹp kiểu thành chuỗi và kiểm tra rằng toExponential không thuộc phương thức chuỗi.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Ví dụ 3: mã ví dụ dưới đây không có lỗi biên dịch nhưng sẽ có lỗi thời gian chạy vì TypeScript sẽ CHỈ thu hẹp kiểu thành chuỗi trong khối được bảo vệ nhưng không theo sau, do đó foo.toExponential sẽ không tạo ra lỗi biên dịch (TypeScript không nghĩ là như vậy một loại chuỗi). Tuy nhiên, trong runtime, string không có phương thức toExponential nên sẽ bị lỗi runtime.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
Ví dụ 4: nếu chúng ta không sử dụng "test is string" (loại vị từ), TypeScript sẽ không thu hẹp loại trong khối được bảo vệ và đoạn mã ví dụ dưới đây sẽ không có lỗi biên dịch nhưng nó sẽ có lỗi thời gian chạy.
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Kết luận là "kiểm tra là chuỗi" (vị từ kiểu) được sử dụng trong thời gian biên dịch để cho các nhà phát triển biết mã sẽ có khả năng xảy ra lỗi thời gian chạy. Đối với javascript, các nhà phát triển sẽ không BIẾT lỗi trong thời gian biên dịch. Đây là lợi thế của việc sử dụng TypeScript.
booleanphải không?