ts入門(mén)實(shí)戰(zhàn)筆記

02. 簡(jiǎn)單基礎(chǔ)類(lèi)型:
string number boolean symbol 
注意與 String Number Boolean Symbol的區(qū)別(一般用不到)橱鹏。
var a: String = new String('123');
var a:string = '123';

03. 復(fù)雜基礎(chǔ)類(lèi)型:
// 這里需要注意:數(shù)組類(lèi)型的值只有顯示添加了元組類(lèi)型注解后(或者使用 as const症歇,聲明為只讀元組)攒岛,
// TypeScript 才會(huì)把它當(dāng)作元組灸蟆,否則推薦出來(lái)的類(lèi)型就是普通的數(shù)組類(lèi)型

1. 接口類(lèi)型
ts會(huì)將對(duì)象字面量和變量區(qū)別對(duì)待考阱,如下示例:
function someMethod(params: { name: 'string' }){...}
// ① 報(bào)錯(cuò) 存在多余age字段
someMethod({ name: 'xx', age: 2 });
// ② ok
const params = { name: 'xx', age: 2 };
someMethod(params);// 類(lèi)型只要兼容 即可

接口定義方法:
interface ITestFuncion {
  (params: ISomeType): void;
}
const someTestFunc:ITestFuncion = (params) => {...};
不過(guò)一般不用上面的方式定義方法類(lèi)型勾拉,一般用type或者內(nèi)聯(lián)的方式。

只讀屬性:
interface ITest {
  readonly name: string;
}

索引簽名:
interface ITest {
  [key: string]: string;
}
索引簽名的限制:具名屬性的類(lèi)型需要是索引簽名類(lèi)型的同類(lèi)型或者兼容的子類(lèi)型形入。
特殊性:數(shù)字索引字段可以與 [key: string] 類(lèi)型的索引兼容全跨。即如下示例是ok的:
const someObj: ITest = { 1: 'xxx' };

接口繼承:
interface A extends B {...}
接口實(shí)現(xiàn):
class A implements B {...}


2.類(lèi)型別名
將部分定義抽離出來(lái),可以進(jìn)行復(fù)用亿遂。
type A = number | string;

總結(jié):
大部分情況下浓若,interface和type是等價(jià)的,但是同時(shí)定義同名interface或type時(shí)蛇数,表現(xiàn)會(huì)有差異挪钓。
{
  interface A { id: number; }
  interface A { name: string; }
  const a: A = { id: 123, name: 'xxx' }; // ok
  // 利用這個(gè)特性 公共庫(kù)的定義文件 我們可以很方便的進(jìn)行擴(kuò)展
}
{
  type A = { id: number; }
  // ts報(bào)錯(cuò)
  type A  = { name: string; }
}


3. 聯(lián)合類(lèi)型(union)和交叉類(lèi)型(intersection)
可以幫助我們進(jìn)行類(lèi)型抽離,公共類(lèi)型的復(fù)用耳舅。

聯(lián)合(滿(mǎn)足C或D即可):
type A = C | D
交叉(同時(shí)滿(mǎn)足C和D):
type A = C & D

當(dāng)存在同名屬性時(shí)碌上,聯(lián)合和交叉類(lèi)型都會(huì)進(jìn)行類(lèi)型縮減,不同的是聯(lián)合類(lèi)型會(huì)往大里擴(kuò)展,交叉類(lèi)型會(huì)往小里擴(kuò)展馏予。
tips:never類(lèi)型是所有類(lèi)型的子類(lèi)型蔓纠。

合并聯(lián)合類(lèi)型(實(shí)際是取交集):
type UnionA = 'px' | 'em' | 'rem' | '%';
type UnionB = 'vh' | 'em' | 'rem' | 'pt';
type IntersectionUnion = UnionA & UnionB;

??:
type BorderColor = 'black' | 'red' | 'green' | 'yellow' | 'blue' | string; // 類(lèi)型縮減成 string 字符串字面量 black、red 等都無(wú)法自動(dòng)提示出來(lái)
type BorderColor = 'black' | 'red' | 'green' | 'yellow' | 'blue' | string & {}; // 字面類(lèi)型都被保留( ts的黑魔法)這樣IDE可以正常提示了


4. 枚舉類(lèi)型
定義命名常量集合吗蚌。
7 種常見(jiàn)的枚舉類(lèi)型:數(shù)字類(lèi)型腿倚、字符串類(lèi)型、異構(gòu)類(lèi)型蚯妇、常量成員和計(jì)算(值)成員敷燎、枚舉成員類(lèi)型和聯(lián)合枚舉、常量枚舉箩言、外部枚舉
// 默認(rèn)不指定其他類(lèi)型值既是數(shù)字類(lèi)型
enum TypeEnum {
  A, // 默認(rèn)從0開(kāi)始遞增
  B,
}
// 字符串類(lèi)型
enum TypeEnum {
  A = 'A', 
  B = 'B',
}
// 異構(gòu)類(lèi)型:基本不這么用
enum TypeEnum {
  A = 'A', 
  B = 2
}
// 常量成員和計(jì)算成員: 很難用到
在前邊示例中硬贯,涉及的枚舉成員的值都是字符串、數(shù)字字面量和未指定初始值從 0 遞增數(shù)字常量陨收,都被稱(chēng)作常量成員饭豹。
另外,在轉(zhuǎn)譯時(shí)务漩,通過(guò)被計(jì)算的常量枚舉表達(dá)式定義值的成員拄衰,也被稱(chēng)作常量成員。
enum SomeEnum {
    // 常量成員
    None,
    Read = 1 << 1,
    Write = 1 << 2,
    ReadWrite = Read | Write,
    // 計(jì)算成員
    G = "123".length,
  }

// 外部枚舉
declare enum Day {
  SUNDAY,
  MONDAY,
}
const work = (x: Day) => {
  if (x === Day.SUNDAY) {
    x; // 類(lèi)型是 Day
  }
}
// declare enum 定義的枚舉轉(zhuǎn)化成js后 聲明移除饵骨,但是引用未被轉(zhuǎn)換 代碼如下
const work = (x) => {
  if (x === Day.SUNDAY) {
    x;
  }
}
// 但使用declare const enum
declare const enum Day {
  SUNDAY,
  MONDAY,
}
const work = (x: Day) => {
  if (x === Day.SUNDAY) {
    x; // 類(lèi)型是 Day
  }
}
// declare const enum 定義的枚舉轉(zhuǎn)化成js后 聲明移除 表現(xiàn)同常規(guī)枚舉定義(內(nèi)聯(lián)枚舉值)
const work = (x) => {
  if (x === 0) {
    x;
  }
}


5. 泛型
什么是泛型:泛型指的是類(lèi)型參數(shù)化翘悉,即將原來(lái)某種具體的類(lèi)型進(jìn)行參數(shù)化。
和定義函數(shù)參數(shù)一樣居触,我們可以給泛型定義若干個(gè)類(lèi)型參數(shù)妖混,并在調(diào)用時(shí)給泛型傳入明確的類(lèi)型參數(shù)。
設(shè)計(jì)泛型的目的在于有效約束類(lèi)型成員之間的關(guān)系轮洋,比如函數(shù)參數(shù)和返回值制市、類(lèi)或者接口成員和方法之間的關(guān)系。
函數(shù)的泛型入?yún)⒈仨毢蛥?shù)/參數(shù)成員建立有效的約束關(guān)系才有實(shí)際意義.
function uselessGenerics<P>(): P {
  return void 0 as unknown as P; // 無(wú)意義
}
// react 組件也支持泛型
function SomeCom<P>(props:P) {
  return <></>;
};
<SomeCom<{ name: string; }> name="1" ... />

// 泛型支持運(yùn)算:
type StringOrNumberArray<E> = E extends string | number ? E[] : E;
type BooleanOrString = string | boolean;
// 鼠標(biāo)hover到WhatIsThis上弊予,顯示boolean | string[]祥楣,因?yàn)榉峙錀l件類(lèi)型:
// 關(guān)于分配條件類(lèi)型這個(gè)概念,官方的釋義:在條件類(lèi)型判斷的情況下(比如示例中出現(xiàn)的 extends)
// 如果入?yún)⑹锹?lián)合類(lèi)型块促,則會(huì)被拆解成一個(gè)個(gè)獨(dú)立的(原子)類(lèi)型(成員)進(jìn)行類(lèi)型運(yùn)算荣堰。
type WhatIsThis = StringOrNumberArray<BooleanOrString>; //  boolean | string[]
// 這里BooleanOrString 不是一個(gè)泛型床未,不會(huì)拆解(你可以理解他就是一個(gè)類(lèi)型竭翠,所以返回他自己)
type BooleanOrStringGot = BooleanOrString extends string | number
  ? BooleanOrString[]
  : BooleanOrString; //  string | boolean

// 泛型約束:將泛型約束在特定的類(lèi)型范圍內(nèi)
function reflectSpecified<P extends number | string | boolean>(param: P):P {
  return param;
}
// 給泛型指定默認(rèn)值
interface IProps<State = { id: number; name: string }> {
  state: State
}
// 組合
interface IProps<State extends {} = { id: number; name: string }> {
  state: State
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薇搁,隨后出現(xiàn)的幾起案子斋扰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传货,死亡現(xiàn)場(chǎng)離奇詭異屎鳍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)问裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)逮壁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人粮宛,你說(shuō)我怎么就攤上這事窥淆。” “怎么了巍杈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵忧饭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筷畦,道長(zhǎng)词裤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任鳖宾,我火速辦了婚禮吼砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鼎文。我一直安慰自己帅刊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布漂问。 她就那樣靜靜地躺著赖瞒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚤假。 梳的紋絲不亂的頭發(fā)上栏饮,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音磷仰,去河邊找鬼袍嬉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灶平,可吹牛的內(nèi)容都是我干的伺通。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逢享,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罐监!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瞒爬,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弓柱,失蹤者是張志新(化名)和其女友劉穎沟堡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矢空,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡航罗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁药。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粥血。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酿箭,靈堂內(nèi)的尸體忽然破棺而出立莉,到底是詐尸還是另有隱情,我是刑警寧澤七问,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布蜓耻,位于F島的核電站,受9級(jí)特大地震影響械巡,放射性物質(zhì)發(fā)生泄漏刹淌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一讥耗、第九天 我趴在偏房一處隱蔽的房頂上張望有勾。 院中可真熱鬧,春花似錦古程、人聲如沸蔼卡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雇逞。三九已至,卻和暖如春茁裙,著一層夾襖步出監(jiān)牢的瞬間塘砸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工晤锥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掉蔬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓矾瘾,卻偏偏與公主長(zhǎng)得像女轿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壕翩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一蛉迹、基礎(chǔ)類(lèi)型:boolean為布爾值類(lèi)型,如let flag:boolean = true;number為數(shù)值類(lèi)型...
    eks閱讀 684評(píng)論 0 0
  • 表情是什么戈泼,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒婿禽。表情可以傳達(dá)很多信息赏僧。高興了當(dāng)然就笑了大猛,難過(guò)就哭了扭倾。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,908評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)挽绩,但是人生放棄了冒險(xiǎn)膛壹,也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 6,046評(píng)論 0 4