TS中的問號 ? 與感嘆號 ! 是什么意思

參考
巧用ES系列4: TypeScript中的問號 ? 與感嘆號 ! 是什么意思?

一、什么是 ?(問號)操作符飞傀?

在TypeScript里面,有4個地方會出現(xiàn)問號操作符,他們分別是

1.三元運算符
// 當 isNumber(input) 為 True 時返回 ? : 之間的部分淫僻; 
// isNumber(input) 為 False 時返回 : ; 之間的部分
const a = isNumber(input) ? input : String(input);
2.可選參數(shù)
// 這里的 ?表示這個參數(shù) field 是一個可選參數(shù)
function getUser(user: string, field?: string) {
}
3.成員
// 這里的壶唤?表示這個name屬性有可能不存在
class A {
  name?: string
}

interface B {
  name?: string
}
4.安全鏈式調用
// 這里 Error對象定義的stack是可選參數(shù)雳灵,如果這樣寫的話編譯器會提示
// 出錯 TS2532: Object is possibly 'undefined'.
return new Error().stack.split('\n');

// 我們可以添加?操作符,當stack屬性存在時闸盔,調用 stack.split悯辙。
// 若stack不存在,則返回空
return new Error().stack?.split('\n');

// 以上代碼等同以下代碼, 感謝 @dingyanhe 的監(jiān)督
const err = new Error();
return err.stack && err.stack.split('\n');
二迎吵、什么是6阕(感嘆號)操作符?

在TypeScript里面有3個地方會出現(xiàn)感嘆號操作符击费,他們分別是

1.一元運算符
// ! 就是將之后的結果取反拢蛋,比如:
// 當 isNumber(input) 為 True 時返回 False; 
// isNumber(input) 為 False 時返回True
const a = !isNumber(input);
2.成員
// 因為接口B里面name被定義為可空的值蔫巩,但是實際情況是不為空的瓤狐,
// 那么我們就可以通過在class里面使用!批幌,重新強調了name這個不為空值
class A implemented B {
  name!: string
}

interface B {
  name?: string
}

這里可以參考ts 更嚴格的類屬性檢查

Typescript 2.7 引入了一個新的控制嚴格性的標記 –strictPropertyInitialization, 這個參數(shù)在 tsconfig.ts 中來配置

"strictNullChecks": true
"strictPropertyInitialization": true

作用

  • 使用這個標記會確保類的每個實例屬性都會在構造函數(shù)里或使用屬性初始化器賦值础锐。
  • 它會明確地進行從變量到類的實例屬性的賦值檢查

舉例

class C {
  foo: number;
  bar = "hello";
  baz: boolean;
  constructor() {
    this.foo = 42;
  }
}

上述代碼,首先編輯器會報錯: 屬性“baz”沒有初始化表達式荧缘,且未在構造函數(shù)中明確賦值皆警。ts(2564)
其次在編譯報錯:error TS2564: Property 'baz' has no initializer and is not definitely assigned in the constructor.

兩種都告訴開發(fā)者截粗,應該給 baz 顯示賦值信姓,但是某種情況下鸵隧,在初始化的時候我們并不想賦值,更期望是 undefined意推,而后再去賦值豆瘫,此時 !: 就派上用場了。

在上述代碼中 屬性 baz 冒號之前加上 ! ,這樣就不會報錯了

class C {
  foo: number;
  bar = "hello";
  baz!: boolean;
  constructor() {
    this.foo = 42;
  }
}
3.強制鏈式調用
// 這里 Error對象定義的stack是可選參數(shù)菊值,如果這樣寫的話編譯器會提示
// 出錯 TS2532: Object is possibly 'undefined'.
new Error().stack.split('\n');

// 我們確信這個字段100%出現(xiàn)外驱,那么就可以添加!腻窒,強調這個字段一定存在
new Error().stack!.split('\n');
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昵宇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儿子,更是在濱河造成了極大的恐慌瓦哎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柔逼,死亡現(xiàn)場離奇詭異蒋譬,居然都是意外死亡,警方通過查閱死者的電腦和手機愉适,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門犯助,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人儡毕,你說我怎么就攤上這事也切∑嗣模” “怎么了腰湾?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疆股。 經常有香客問我费坊,道長,這世上最難降的妖魔是什么旬痹? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任附井,我火速辦了婚禮,結果婚禮上两残,老公的妹妹穿的比我還像新娘永毅。我一直安慰自己,他們只是感情好人弓,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布沼死。 她就那樣靜靜地躺著,像睡著了一般崔赌。 火紅的嫁衣襯著肌膚如雪意蛀。 梳的紋絲不亂的頭發(fā)上耸别,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音县钥,去河邊找鬼秀姐。 笑死,一個胖子當著我的面吹牛若贮,可吹牛的內容都是我干的省有。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兜看,長吁一口氣:“原來是場噩夢啊……” “哼锥咸!你這毒婦竟也來了?” 一聲冷哼從身側響起细移,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤搏予,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弧轧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雪侥,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年精绎,在試婚紗的時候發(fā)現(xiàn)自己被綠了速缨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡代乃,死狀恐怖旬牲,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情搁吓,我是刑警寧澤原茅,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站堕仔,受9級特大地震影響擂橘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜摩骨,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一通贞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恼五,春花似錦昌罩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春绘搞,著一層夾襖步出監(jiān)牢的瞬間彤避,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工夯辖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琉预,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓蒿褂,卻偏偏與公主長得像圆米,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啄栓,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容