-
函數類型
let log = function (message) {
????console.log(message);
}
let log2 = (message: string) => console.log(message);
log2('hello');//參數只能轉入string
typescript中,函數的寫法與JavaScript的完全一樣,與JavaScript最大的不同就是,typescript 可以給函數綁定類型。
let log3 = (message: string, code?: number) => {
????console.log(message, code);
}
log3('hello', 3);
typescript中,調用函數與JavaScript有個顯著的不同,就是typescript調用函數過程中,如果函數定義了兩個參數,調用時必須填寫兩個參數,并且類型要一致。typescript可以使用 ? 來表示參數的可選性,被用 ? 來指定的參數可以不填寫,函數里面的這個參數就被設定為undefined;也可以給參數設定默認值
let log3 = (message: string, code: number = 0, data?: array) => {
????console.log(message, code);
}
log3('hello');
注意:不管是可選參數,還是默認參數,都必須在參數列表的末尾,并且按照從后往前的順序進行排列
查看全部 -
類型適配(類型斷言)Type Assertions
let message : any; //初始化聲明了變量的類型,后續不會因為賦值而改變類型
message = 'abc';
message.endsWith('c'); //此時message類型是any類型而不是string類型
如何改變變量初始化的類型?
明確告訴typescript編譯器目前message真正的類型就是string,而通知typescript進行類型適配的過程就叫做?Type Assertions,中文叫類型斷言。
兩種方法:1、let ddd =? (<string>message).endsWith('c');
2、let aaa = (message as string).endsWith('c');
注意!注意!注意!
在使用類型適配?Type Assertions 的時候,一定要非常非常了解當前變量的類型,必須對自己的代碼有百分之百的信心!否則引發嚴重的錯誤!
查看全部 -
1、void:
函數在沒有任何返回的情況下,函數就是一個 void 類型。
funciton printResult() {
????console.log('lalalla');
}
也可以給函數指定類型:
function printResult() : void {
????console.log('lalalla');
}
console.log('hello ', printResult()); //hello undefined
在原生JavaScript中沒有void對應的表述的。
2、undefined:
function printResult() :?undefined?{
????console.log('lalalla');
????return;
}
使用過JavaScript的都知道,其實undefined也是一個值,是一個未經初始化的值。
使用undefined的時候可以說某個東西是undefined,但使用void,表示這個東西不存在。
兩者都表示沒有,undefined說的是變量沒有賦值沒有初始化,而void指定是變量本身就不存在。
3、never:(一個函數永遠執行不完,這就是 never 的本質。實際開發過程中,never是用來控制邏輯流程的,大部分是用來處理異?;蛘咛幚韕romise)
function throwError(message: string, errorCode: number) : never {
????throw { //拋出異常,強行結束
????????message,
????????errorCode
????}
????//永不會執行到這里,這個函數永遠不會執行完成,因此這個函數類型是 never
}
throwError('not found', 404);
function whileLoop() : never {
????while(true) {
????????console.log('hhh');
????}
}
查看全部 -
1、any 支持并且兼容所有類型()
let randomVal: any = 666;
randomVal = true;
randomVal = 'sdfsa';
randomVal = {};
randomVal();
randomVal.toUpperCase();
這段代碼編寫沒有報錯,但編譯后就報錯了!
2、unkonwn 不保證類型,但能保證類型安全
在使用 unkonwn變量的時候,需要做一定程度的判斷或者類型轉換,當確定變量類型以后才能正常使用。
let randomVal: unkonwn = 666;
randomVal = true;
randomVal = 'sdfsa';
randomVal = {};
if (typeof randomVal === 'function') {
????randomVal();
}
if (typeof randomVal === 'string') {
????randomVal.toUpperCase();
}
區別:
使用any適合代碼的快速成型快速上線,但是會遺留一些明顯的安全隱患。
使用unkonwn比any保險一點,可以保證類型的安全。
查看全部 -
動態類型:any
(重點問題:日常使用JavaScript的時候其實就是在使用一個any類型,那么,typescript目的是給JavaScript帶來強類型定義,為什么還要引用這種any類型動態支持各種類型呢?)
使用any主要的目的是為了加速我們的開發過程,避免太冗長或者沒有必要或者約定俗成的類型定義。
有人說使用typescript就不要使用any,使用any就失去了類型的意義了。
在代碼中使用any,目的是為了快速開發、提升效率,避免過度設計。
可以想一下,為什么JavaScript可以流行這么多年還經久不衰,這正是因為JavaScript的靈活性!
而typescript所帶來的any則在極大程度上保留了JavaScript的它的靈活性,喜歡JavaScript是因它無與倫比的靈活性,但是痛恨的同樣也是它的靈活性。
JavaScript這種野蠻生長猥瑣發育的靈活性可以讓團隊快速開發,但是給也會給團隊帶來不可閱讀性、不可維護性、不可拓展性等一系列的問題,而typescript則正是因為有any類型,才能在繼承JavaScript以后最大程度的保持語言靈活性的同時,還能帶來強類型語言才能形成的高可維護性。
typescript中的any絕非無意義,它是通過多方論證得出的結果,所有要多用,并且用好any類型,使用any類型時一定要小心,合理使用它!
查看全部 -
枚舉類型 enum (在默認情況下,枚舉類型的表現形式與c++類似,枚舉類型真正的類型數據是數字,也是從0開始計算)
enum Color1 = {red, green, blue}
let color1 = Color.blue; //2
enum Color2 = {red = 5, green, blue}
let color2 = Color2.blue; //7
enum Color3 = { red = 3, green = 'greeen', blue = true}
let color3 = Color3.blue; //true
查看全部 -
聯合類型:一個變量可以同時支持兩個或多個不同的類型
let union : string | number
union = 2;
union = 'sdfedf';
union = true; 報錯
let union2 : number | string | boolean | string[]
function merge(n1: number | string, n2: number | string) {
????if (typeof n1 === 'string' || typeof n2 === 'string')?
????????return n1.toString() + n2.toString;
????else?
????????return n1 + n2;
}
let mergeNumber = merge(1,3); //4
let mergeString = merge('2','4'); //24
let mergeString = merge('hello', 2); //hello2
查看全部 -
數組 array
let list1: number[] = [1,2,3,4]
let list2: Array<number> = [1,2,3,4]
let list3 = [1,2,3,4]
let list4 = [1,'aa']
let list5: any[] = [1,'aa',true]
元組 tuple(固定長度、固定類型的數組,聲明元組的時候一定要指明類型,bug:使用 .push() 可以突破元組的界限,無限的給元組添加長度)
let person1: [number, string] = [1, 'lulingkun']
元組是一個特殊的數組,是固定長度固定類型的數組
元組bug:person1[2] = 3; 報錯,但 person1.push(3) 不報錯可以通過編譯
let person2 = [1, 'lulingkun']; 這不是元組類型,而是union array,聯合類型數組,本質上就是數組,既沒有固定長度也沒有固定類型,是混合number和string的類型
查看全部 -
給函數的參數設置取值類型
function add (n1: number, n2: number) {
????return n1 + n2;
}
自動映射數據類型
let isTrue = true;
手動指定數據類型
let total: number = 0;
查看全部 -
string 字符串類型
"hello"
'hello'
`hello`
查看全部 -
高級類型
union 組合類型
nullable 可空類型
literal 預定義類型
查看全部 -
typescript 的基本類型
boolean、string、number、array、object、null、undefined
tuple、enum、void、never、any
查看全部 -
var 沒有 block 作用域,在 JavaScript 中可以無限次數聲明和使用,導致內存泄漏
推薦使用:
const 聲明常量
let 聲明變量(解決 var 中帶來的作用域混論的問題)
查看全部 -
熱味兒
查看全部 -
interface?IPoint?{
??drawPoint:?()?=>?void;
??getDistance:?(p:?IPoint)?=>?number;
??//?getter??setter?正常寫法
??//?getX:()=>number;
??//?setX:(value)=>void;
??//?getY:()=>number;
??//?setY:(value)=>void;
??//?懶人包寫法
??X:?number;
??Y:?number;
}
class?newPoint?implements?IPoint?{
??constructor(private?x:?number,?private?y:?number)?{
????console.log(`在?constructor?中,x?is?${x},y?is?${y}`);
??}
??drawPoint?=?()?=>?{
????console.log(`x?:?${this.x},?y?:?${this.y}`);
??}
??getDistance?=?(p:?IPoint)?=>?{
????return?Math.sqrt(Math.pow(p.X?-?this.x,?2)?+?Math.pow(p.Y?-?this.y,?2));
????//?return?0;
??}
??//?懶人包寫法
??get?X()?{
????return?this.x;
??}
??set?X(value:?number)?{
????this.x?=?value;
??}
??get?T()?{
????return?this.y;
??}
??set?Y(value:?number)?{
????this.y?=?value;
??}
??//?正常寫法
??//?setX?=(value:number)=>{
??//?if(value<0){
??//?throw?new?Error("value?不能小于0")
??//?}
??//?this.x=value;
??//?}
??//?setY?=(value:number)=>{
??//?if(value<0){
??//?throw?new?Error("value?不能小于0")
??//?}
??//?this.y=value;
??//?}
??//?getX=()=>{
??//?return?this.x;
??//?}
??//?getY=()=>{
??//?return?this.y;
??//?}
}
查看全部
舉報