let decLiteral: number = 6; let hexLiteral: number = 0xf00d; let binaryLiteral: number = 0b1010; let octalLiteral: number = 0o744;
陣列
1 2 3
//原則上ts的變數都要寫型別,而如果一個變數的型別是array //且這個array的子項型別都是number,則可寫成如下 let list: number[] = [1, 2, 3];
1 2
//承上,或如下利用泛型 let list: number[] = [1, 2, 3];
元組(陣列型別專用)
最基本的範例:
1 2 3 4 5 6
// Declare a tuple type let x: [string, number]; // Initialize it x = ['hello', 10]; // OK // Initialize it incorrectly x = [10, 'hello']; // Error
為陣列編寫型別的好處
1 2 3 4
let x: [string, number]; x = ['hello', 10]; // OK console.log(x[0].substr(1)); // OK 因為x[0]在元組中定義為字串,可以使用substr方法 console.log(x[1].substr(1)); // Error, 因為10屬於在元組中定義為數字,不能使用substr方法,所以會報錯
functionFoo() { returnnewProxy(this, { get: function (object, property) { if (Reflect.has(object, property)) { returnReflect.get(object, property); } else { returnfunctionmethodMissing() { console.log('you called ' + property + ' but it doesn\'t exist!'); } } } }); }
Foo.prototype.bar = function () { console.log('you called bar. Good job!'); }
foo = new Foo(); foo.bar(); //=> you called bar. Good job! foo.this_method_does_not_exist() //=> you called this_method_does_not_exist but it doesn't exist
let handler = { get: function(target, name) { return name in target ? target[name] : 37; }, set: function(target, name, value) { if (name === 'age') { if (!Number.isInteger(value)) { thrownewTypeError('The age is not an integer'); } if (value > 200) { thrownewRangeError('The age seems invalid'); } }
// The default behavior to store the value target[name] = value;
// Indicate success returntrue; } };
let p = newProxy({}, handler);
這樣寫的話,當我們去執行console.log(p.abc),也就是去取用p的屬性值,就會觸發get function 而如果我們去執行p.abc = “123”, 就會觸發set function,這就是最基本的handler.get和handler.set的運用
下週繼續: 常用的handler方法與他們的使用範例
1. handler.apply
基本上大家都知道apply就跟call 是類似的東西, 他們是被用來執行一個函數, 並且可以塞特定的變數(或array)進去函式作為 this 使用; 而當一個函式被帶入proxy建構式而建立起proxy物件的時候, 因為函式本身也是一種物件(見MDN解說, 所以這樣就會變成只要該函式被以任何一種形式(一般/call/apply)呼叫的時候就會觸發代理的apply
functionFoo() { returnnewProxy(this, { get: function (object, property) { // 用reflect.has 去判斷 object 是不是有那個key 值 if (Reflect.has(object, property)) { returnReflect.get(object, property); } else { //如果方法不存在, 那就return 一個攔截用的function returnfunctionmethodMissing() { console.log('you called ' + property + ' but it doesn\'t exist!'); } } } }); }
Foo.prototype.bar = function () { console.log('you called bar. Good job!'); }
foo = new Foo(); foo.bar(); //=> you called bar. Good job! foo.this_method_does_not_exist() // error 被攔截 //=> you called this_method_does_not_exist but it doesn't exist