-
什么事interface
用于描述對(duì)象的結(jié)構(gòu)和屬性。本身就是個(gè)類型
interface可以被實(shí)現(xiàn)(implements)或擴(kuò)展(extends)。和類有關(guān)系。
什么是type
表示類型的別名。
它允許我們?yōu)槿魏晤愋蛣?chuàng)建別名。包括上面的interface也可以用類型創(chuàng)建別名。
type可以表示對(duì)象,聯(lián)合類型,交叉類型等,并且可以進(jìn)行復(fù)雜的類型操作。
interface User{
? ? name:string
? ? age:number
}
type UserType={
? ? name:string
? ? age:number
}
type UserType1=User;
function fun(params:User):User{
? ? params.age
? ? return params;
}
這個(gè)函數(shù)這樣寫冒號(hào)后面的代表返回值,也可以用UserType.
上面那個(gè)是接口對(duì)象,下面的UserType是對(duì)象別名,右邊的是對(duì)象
有什么區(qū)別?
1,一個(gè)是結(jié)構(gòu),一個(gè)是別名
inerface可以擴(kuò)展,type不能擴(kuò)展。
interface Person extends User{
email:string
}? Person接口對(duì)象繼承User的屬性外,額外添加email的屬性。
2,interface重名會(huì)合并,type不能重名。
interface User{
? ? gender:string
? ? name:number
}
前面已經(jīng)定義了name是string ,這里改成number會(huì)報(bào)錯(cuò)。
3,interface可以被類實(shí)現(xiàn),type不能。inteface就是接口對(duì)象,就是拿來(lái)被類實(shí)現(xiàn)的。用class的關(guān)鍵字就可以定義一個(gè)類
class Man implements User{
? ?
}
定義一個(gè)類叫Man,這個(gè)Man會(huì)報(bào)錯(cuò),讓你必須要去實(shí)現(xiàn)user里面定義好的屬性,不能不實(shí)現(xiàn)它。用一個(gè)接口對(duì)一個(gè)類要實(shí)現(xiàn)的東西進(jìn)行約束
class Man implements User{
? ? name:string;
? ? age:number;
? ? gender:string;
? ? constructor(name:string,age:number,gender:string){
? ? ? ? this.name=name;
? ? ? ? this.age=age;
? ? ? ? this.gender=gender;
? ? }
}
這樣還是會(huì)報(bào)錯(cuò),會(huì)提示你必須要寫個(gè)構(gòu)造器進(jìn)行初始化。用一個(gè)叫Man的類實(shí)現(xiàn)了User的屬性。如果接口里面加了個(gè)函數(shù),這個(gè)類里面也必須要有這個(gè)函數(shù)
4,type支持聯(lián)合類型和交叉類型,interface不支持
type可以定義一個(gè)兩個(gè)類型運(yùn)算之后的別名,
type People=Man | Woman
|或的運(yùn)算,只要符合一個(gè)就可以
interface Woman{
? ? age:number
}
interface Man{
? ? name:string
}
type People = Man | Woman
const p:People={
? ? //age:12,
? ? name:'jack'
}
Man | Woman就是聯(lián)合類型的,交叉類型用&符表示
type UserMan=Man & Woman
const u:UserMan = {
? ? name:'jack',
? ? age:12
}
必須兩個(gè)屬性都有
type可以進(jìn)行簡(jiǎn)單的聯(lián)合類型和交叉類型的運(yùn)算
在日常工作中,定義描述結(jié)構(gòu)的時(shí)候大多數(shù)用的是interface ,只有在要對(duì)類型做一個(gè)運(yùn)算的時(shí)候才會(huì)用type.不知道用type還是用interface的時(shí)候,兩個(gè)都可以的時(shí)候,就用interface。
規(guī)范
1,定義類型首字母都要大寫,有的公司會(huì)要求在interface前面加個(gè)大寫的I,在type前面加個(gè)大寫的T,不推薦加這個(gè),java里面經(jīng)常用到。前端很少用到class。
查看全部 -
利用枚舉類型如何實(shí)現(xiàn)表驅(qū)動(dòng)法?
? ?(表驅(qū)動(dòng)法幫助我們簡(jiǎn)化代碼并且邏輯看上去更清爽)
????條件判斷語(yǔ)句很多的時(shí)候用if else哪怕是switch 可讀性都是很差的,不好看
用枚舉類型對(duì)它進(jìn)行優(yōu)化
枚舉類型用enum這樣一個(gè)關(guān)鍵字來(lái)修飾,跟對(duì)象很相似但是沒有=號(hào),里面可以定義不同的狀態(tài),用不同的變量去定義不同的狀態(tài),方便別人閱讀,起到了文檔的作用。但還是有if else還是不夠簡(jiǎn)潔,用表驅(qū)動(dòng)就是為了干掉if,else和switch,因?yàn)槟菢拥膶懛〞?huì)把很多的邏輯耦合到一起。
表驅(qū)動(dòng),
定義一個(gè)對(duì)象,然后定義類型的時(shí)候用Record? ,高級(jí)類型,Record<number,(order:Order)=>void=>{}? record可以理解為js中object,key是number類型,value是function的類型,有點(diǎn)像映射,一對(duì)一。
數(shù)字枚舉
本身就是數(shù)字 不寫默認(rèn)從0開始??OrderStatus3{Pending=3}
字符串枚舉
enum OrderStatus3{Pending="pending"}
易構(gòu)枚舉
enum OrderStatus3{Pending,completed='completed'}
沒有指定的就是0,指定了的就變成了字符串,不定義的放中間就不行,因?yàn)樗恢缽膸组_始
枚舉成員的類型不能是function
enum Obj{a,b=Obj.a,c=Math.random(),d=1+2,e=()=>false}最后那個(gè)會(huì)報(bào)錯(cuò)
//常量枚舉 并不會(huì)轉(zhuǎn)譯成任何的js代碼 ,只有在常量使用的時(shí)候才會(huì)進(jìn)行轉(zhuǎn)譯,少生成JS代碼
const enum ConstOrderStatus{Pending,Shipped}
//基本的枚舉是會(huì)轉(zhuǎn)譯成js代碼的,會(huì)生成一個(gè)類似于對(duì)象的東西
enum ConstOrderStatus{Pending,Shipped}
ConstOrderStatus.Pending=233? 會(huì)報(bào)錯(cuò),是只讀的,不能這樣修改
常量枚舉和基本枚舉不能比較。其它枚舉不同的元素也不能進(jìn)行比較
查看全部 -
js的類型:
7種基本類型:boolean,number ,string ,null,undefined,symbol(es6),bigint(es10) 2020.
引用類型obj:arry,function,date
ts新增類型:
tuple 元祖
nver
any
void
其他高級(jí)類型
:+類型名字? 類型注解
重新定義類型會(huì)報(bào)錯(cuò)
類型不同不能相互賦值
null只能賦值給null,undefined只能賦值給undefined? null不等于undefined;
Symbole()獨(dú)一無(wú)二的變量 命名沖突,私有屬性? 拿它解決
BigInt(322223112333);? number類型有精度限制,這個(gè)就是為了解決這個(gè)問題。大數(shù)不會(huì)失真
Tsconfig? target: ESNext? ?module:ESNext?
數(shù)組? :string[]? ?: Array<number|string>? ?聯(lián)合類型
元組 是特殊的數(shù)組? tuple:[string,number,boolean]=['a',1,false];
tuple.push('abc')
tuple[2]? 能加不能讀,不能夠越界,必須要是要一一對(duì)應(yīng)
函數(shù)
fun1:(params:string)=>boolean=()=>false
function fun2(params:string):boolean{return false}
type Fun=(params:string)=>boolean;? 類型定義可復(fù)用
const fun1:Fun=()=>false;
const fun3:Fun=()=>true;
對(duì)象
const obj:object={a:1,b:2,}工作中不這樣定義 ,因?yàn)閛bject比較泛,有點(diǎn)類似any了,類型越具體越好
const obj1:{a:string,b:string}={a:'1',b:'2'}
interface Obj {a:string,b:string}
const obj1:Obj={a:'1',b:'2'}
void 沒有任何返回值
const v=():void=>{}
any;如果都是any就和javascript沒有區(qū)別了
沒有加類型注解沒有加:默認(rèn)就是any的 可以隨便的賦值? 盡量別使用any,使用any就放棄了類型的好處
let x;
x=1;
never? 永遠(yuǎn)不會(huì)有返回值? ? 在業(yè)務(wù)代碼中很少用never? ?高級(jí)類型編程的時(shí)候會(huì)用到
const n1=():never=>{throw new Error()}?
const n2=():never=>{while(true){}}? 死循環(huán)卡這兒了
查看全部 -
//? Record 工具類型實(shí)現(xiàn)原理
type RecordType<K extends string | number | symbol, T> = { [P in K], T }
const infoObj: Record<string,string> = { a:'a' }
查看全部 -
索引類型,定義key:value,key和value可以定義為任何類型;通常定義數(shù)組對(duì)象
interface Person {
????name: string
????age: number
}
const personInfos: Person = { name: 'a', age: 16 }
// 》》》》》》》》》》 索引類型
interface Student {
????[id: number]: Person // id只是個(gè)站位符
}
const sudent: Student = {
? ? 0:{ name:'a', age: 1 }
}
// 映射類型
利用操作符 keyof typeof,根據(jù)已有類型創(chuàng)建新的類型
type Keys = keyof? Person // 'name' | 'age'? 聯(lián)合類型的字面量
typeof 針對(duì)的是 ---- 變量值
type Ty = typeof personInfos? //? ?--- { name: string; age: number }
查看全部 -
interface 描述對(duì)象的結(jié)構(gòu)及屬性
可以被實(shí)現(xiàn)class implements或者extends
interface User {
????name: string;
????age: number
}
// 類型別名
type UserType = User
// 繼承類型
interface Person extends User {
????sex: string
}
查看全部 -
數(shù)字枚舉、字符串枚舉、異構(gòu)枚舉
常量枚舉:不轉(zhuǎn)譯枚舉,代碼較少
每個(gè)枚舉屬性都是只讀的,不能賦值
查看全部 -
tuple
push可以突破限制,但是讀取不到
const arr: [number,string] = [1,'test'];
arr.push(66);
arr[2]; // 語(yǔ)法錯(cuò)誤
函數(shù)類型:箭頭函數(shù)(推薦)+ 函數(shù)語(yǔ)句
類型別名?
type Func = (p:string) => boolean;
const func1: Func = ('test') => true;
function func2(p:string):boolean{
????return true
}
any: 任何類型,放棄類型檢查
never:永遠(yuǎn)沒有返回值
const f1 = () :never? => {
????throw new Error() // 終止進(jìn)程
????// 或者
????while(true){
????????//? 無(wú)限循環(huán)
????}
}
查看全部 -
fan
查看全部 -
aa
查看全部 -
類型保護(hù)
查看全部 -
表驅(qū)動(dòng)
查看全部 -
有code 和message
查看全部 -
泛型
查看全部 -
映射類型
typeof只能是值或者枚舉
查看全部 -
索引
查看全部
舉報(bào)