typescript - Từ khóa "as" có tác dụng gì?
if (process.env.NODE_ENV !== 'production') {
(WithUser as any).displayName = wrapDisplayName(Component, 'withUser');
}
Tôi thậm chí không chắc nếu as là một từ khóa, nhưng dù sao, nó làm gì trong JavaScript?
Câu trả lời #1
Đó không phải là JavaScript thuần, đó là TypeScript. as any bảo trình biên dịch coi đối tượng đã gõ kiểu như một đối tượng JavaScript không kiểu.
Từ khóa as là một Type Assertion trong TypeScript, nó nói với trình biên dịch xem đối tượng như một loại khác với loại mà trình biên dịch suy luận đối tượng sẽ là.
Câu trả lời #2
Đây là TypeScript, không phải vanilla JS, nhưng về as bản thân nó: Nó được gọi là Type Assertion, bạn chỉ đang nói với trình biên dịch để coi một thứ gì đó như một loại:
var a = 'TEST STRING'
var b = a as string; //Means the compiler will assume it's a string
Nó tương đương với điều này:
var a = 'TEST STRING'
var b = <string> a;
Tuy nhiên, nó có thể gây nhầm lẫn khi làm việc với JSX (JS với thẻ html), vì vậy trong những trường hợp đó, cú pháp as được ưu tiên.
Câu trả lời #3
Đây là một toán tử trong Typescript, nó không có trong ECMAScript 2015 (phiên bản mới nhất của Javascript)
Như các câu trả lời ở trên đã chỉ ra, toán tử 'as' là một dạng Xác nhận Kiểu
Để lấy một ví dụ ngắn, giả sử bạn có hai loại: First và Second. Bạn đang viết một phương thức, và phương thức này không thực sự biết đối tượng của bạn sẽ thuộc loại nào. Nó có thể thuộc loại First hoặc Second.
Vì vậy, bạn khai báo biến của mình mà không cần loại dữ liệu nghiêm ngặt. Khi phương thức của bạn biết được loại dữ liệu mà biến của bạn nên nhận, bạn có thể trả về nó 'như loại đó'.
Điều đó có vẻ hơi mơ hồ và không rõ ràng, nhưng toán tử 'as' thực ra thực hiện cùng một chức năng chính xác như một mẫu khác (quen thuộc hơn):
Hai đoạn mã này làm chính xác cùng một việc
let accountCode = '123';
let castedAccountCode = <number>accountCode;
Sử dụng làm từ khóa:
let accountCode = '123';
let castedAccountCode = accountCode as number;
Câu trả lời số 4
Loại khẳng định kiểu này là vô dụng, vì
function foo (a: string, b: string): number {
return (a as number) + (b as number)
}
chỉ đơn giản chuyển đổi sang
function foo(a, b) {
return a + b;
}
Ban đầu tôi tưởng nó sẽ là một thứ gì đó giống như
function foo(a, b) {
if (typeof a != 'string') throw ...
if (typeof b != 'string') throw ...
return Number(a) + Number(b)
}
nhưng không. TS mang lại cho người dùng cảm giác an toàn sai lầm.
