可選鏈不是ts專屬,自ts3.7版本後內建,它確實解決了物件屬性或方法訪問前判斷是否存在的痛點,可選鏈更直觀來自mdn的解釋
可選鏈操作符?.能夠去讀取乙個被連線物件的深層次的屬性的值而無需明確校驗鏈條上每乙個引用的有效性。?.運算子功能類似於.運算子,不同之處在於如果鏈條上的乙個引用是null 或 undefined,.操作符會引起乙個錯誤,?.操作符取而代之的是會按照短路計算的方式返回乙個undefined。當?.操作符用於函式呼叫時,如果該函式不存在也將會返回undefined。 當訪問鏈條上可能存在的屬性卻不存在時,?.操作符將會使表示式更短和更簡單。當不能保證哪些屬性是必需的時,?.操作符對於探索乙個物件的內容是很有幫助的。
inte***ce
person
const p: person =};
p?.name;
p?.age;p?.
say(
"hello girl"
)//p?.log() //報錯 log方法不存在
//看下編譯後結果吧
"use strict"
;var p =};
p ===
null
|| p ===
void0?
void
0: p.name;
p ===
null
|| p ===
void0?
void
0: p.age;
p ===
null
|| p ===
void0?
void
0: p.
say(
"hello girl"
);
ts的型別相容是基於結構化型別的,簡單來說:如果x要相容y,那麼y至少具有與x相同的屬性。換言之,具有公共屬性,就具備了型別相容的條件。1. 物件的型別相容性
//來看個有意思的例子
inte***ce
animal
inte***ce
person
let a:animal=
;let p:person=
//注意這裡,兩種賦值都不報錯
//ts的結構化型別,某種程度上panfish和tom等價
p=a;
a=p;
// 接下來在上邊的例子中做一下改動,person加乙個age屬性
inte***ce
person
//這裡也加一條屬性
let p:person=
//其他不變
p=a;
//報錯,結構化型別角度考慮,a中沒有age屬性,可多不可少
a=p;
//不報錯
2. 函式的型別相容性
函式也是物件,同樣適用型別相容性規則,但只關注引數型別和順序而不關注引數名
let fn1 =
(m: number)
: number => m;
let fn2 =
(n: number, s: string)
: number =>
+s+n;
//這裡好理解
console.
log(
fn1(
100));
//100
console.
log(
fn2(
100,
"1"));
//101
// 賦值--注意:返回值不一樣肯定是不相容的
fn2=fn1;
//ok
fn1=fn2;
//報錯
// 如果調換f2引數順序為 s: string,n: number,以下皆報錯
fn2=fn1;
//報錯
fn1=fn2;
//報錯
3. 列舉的型別相容性
列舉型別與數字型別雙向相容,基於字串的列舉不相容,跨型別的列舉型別之間不相容。3.1 基於數字的列舉
enum time
let moring = time.moring;
let num:number =10;
//這裡很容易理解,因為 time.moring拿到的值就是乙個數字型別
moring=num;
//ok
num=moring//ok
3.2 跨型別列舉
enum language
//跨型別的列舉型別之間不相容
let js=language.js;
js=moring;
//error
moring=js;
//error
4 類的型別相容性
類的型別相容性大體和物件那部分的相似,但要注意的是:類有靜態部分和例項部分的型別。靜態屬性和靜態方法以及建構函式會在結構化型別相容過程中被忽略,只比較例項屬性和例項方法。public 級別的型別相容性
//實際比較的是例項屬性name,例項方法say
class
animal
//例項方法
say():
void
//靜態方法
static
say():
void
//靜態屬性
static flag: string =
"animal";}
//例項屬性name,age 例項方法say
class
person
say():
void
}let a: animal =};
let p: person =};
a.say()
//say animal
p.say()
;//say person
a = p;
//ok
p = a;
//error a比p少乙個age屬性,無法相容
private/protected 級別的型別相容性
不同於public級別的型別相容性,private/protected 要求更嚴格,必須來自同乙個類
//protected 和 private類似
class
cat}
class
animal
}let c:cat=
;let a:animal=
c=a;
//error
a=c;
//error
Redis基礎教程四
一.事務 1.redis事務是一組命令集合,也同命令一樣是最小執行單位,事務原理是先將乙個事務的命令發給redis,然後再讓redis依次執行這些命令。事務在執行的期間不會主動中斷 伺服器在執行完事務中的所有命令之後,才會繼續處理其他客戶端的其他命令。如 redis multi okredis sa...
Latex基礎教程四
在latex環境下,數學公式的使用是最為常見的,下面將介紹幾個比較常用的語法 1.單個方程式的書寫如下 documentclass usepackage begin begin 1 2 3 end end 得到輸出如下 這裡解釋以下 equation下為方程式環境,代表不需要方程式編號,如果需要為方...
Git基礎教程(四)
簡單的做法先儲存當前的修改 然後切換到有問題的分級,先完成別的功能,然後切換回原來做到一半的develop分支,執行reset命令,銜接之前的工作。git reset head 遇到這種情況的時候,可以像上面那樣先commit,然後再reset回來,另外一種做法是,使用stash功能。首先檢視分支狀...