網站首頁 編程語言 正文
函數
以下聲明了一個函數類型,通過type來定義類型別名,void 表示沒有返回值
type fnType = () => void;
作為參數
函數可以作為參數,傳遞到另一個函數中
type fnType = () => void; function foo(fn: fnType) { fn(); } function bar() { console.log("bar"); } foo(bar); // bar
與js代碼不同的點在于傳入的參數需要定義類型注解
定義函數
定義函數的時候,需要給入參指定類型注解,返回值如果可以自行推導出來,也可以不寫,如 add 和 minus 函數,但是作為參數時,是必須要寫的,如 calc 函數中的入參 fn
function add(num1: number, num2: number): number { return num1 + num2; } function minus(num1: number, num2: number): number { return num1 - num2; } function calc( num1: number, num2: number, fn: (num1: number, num2: number) => void ) { console.log(fn(num1, num2)); } calc(30, 20, add); // 50 calc(30, 20, minus); // 10
函數參數的類型
ts中函數會規定參數的類型和個數,當個數不確定時,可以使用可選類型、剩余參數、默認值
可選類型
可選類型相當于該定義的類型和undefined的聯合類型,所以參數有三種選擇、傳入該類型、不傳或者undefined
function foo(x: number, y?: number) { console.log(x, y); } foo(1, 2); // 1 2 foo(3); // 3 undefined foo(4, undefined); // 4 undefined
參數默認值
參數設置了默認值就使之稱為了可選類型,不過有默認值的參數最好放在必傳參數后面
function baz(x: number = 20, y: number) { console.log(x, y); } baz(10, 20); // 10 20 baz(undefined, 20); // 20 20
剩余參數
剩余參數要放在必傳參數之后
function sum(num: number, ...args: number[]) { console.log(num, args); } sum(10); // 10 [] sum(10, 20); // 10 [20] sum(10, 20, 30); // 10 [20, 30]
this的默認推導
在對象的方法中定義的this,ts是可以自動推導的,但是獨立函數中的this,是推導不出來的。
必須要在獨立函數中定義this的類型
type ThisType = { name: string }; const eating = function (this: ThisType) { console.log(this.name + " eating~"); }; const person = { name: "kiki", eating, }; person.eating()
函數重載
函數重載指的是函數名相同,參數個數或者類型不同,所定義的多個處理方法。
比如需要對字符串拼接或者數字求和操作,雖然我們知道 + 號可以用在字符串和數字上,但是在類型檢測嚴格的ts代碼中,這樣寫編譯是不通過的,需要使用【類型縮小】,縮小類型的判斷,再進行處理。
通過聯合類型,參數組合的可能性越多,需要越多的if語句來進行判斷,并且函數的返回值類型也是未知的,在這種情況下可以使用【函數重載】
在ts中,定義函數名和參數類型的重載函數,再通過實現函數來定義具體實現。 會根據數據類型在重載函數中調用,再執行實現函數的代碼。
function add(x: number, y: number): number; function add(x: string, y: string): string; function add(x: any, y: any) { return x + y; } console.log(add(1, 2)); console.log(add("a", "b"));
如果傳遞的參數與重載函數中定義參數不同,是無法通過編譯的。
類
初始化
類中定義的變量需要初始化,可以在定義類的時候就賦值或者通過constructor來操作
class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } } const person = new Person("alice", 20);
繼承
ts和js中一致,都是通過 extends 實現繼承,使用父級參數和方法時使用 super 關鍵字。
class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } } class Student extends Person { sno: number; constructor(name: string, age: number, sno: number) { super(name, age); this.sno = sno; } } const student = new Student("alice", 20, 1);
多態
使用多態可以寫出更加具備通用性的代碼,如果想要實現多態首先得有繼承,并且父類引用指向子類對象。
class Animal { action() { console.log("animal action"); } } class Dog extends Animal { action() { console.log("dog running"); } } class Fish extends Animal { action() { console.log("fish swimming"); } } function doAction(animals: Animal[]) { animals.forEach((animal) => { animal.action(); }); } doAction([new Dog()]); doAction([new Dog(), new Fish()]); doAction([new Dog(), new Fish(), new Animal()]);
這里相當于 const animal1: Animal = new Dog()
,看起來是 Animal 對象,其實是 Dog 對象,這里的父類引用指向的是子類對象,所以最后執行的是 Dog 對象的方法
成員修飾符
成員修飾符有以下三種
- public 表示共有的,任何地方都可見,當沒有定義成員修飾符時,默認為public
- private 私有的,只有類中能夠訪問到
- protected 被保護的,表示類自身和子類可以訪問到
public
class Person { public username: string = "alice"; getName() { return this.username; } } const person = new Person(); console.log(person.username);
private
通過private修飾的變量,在實例對象上也是不可訪問的。
protected
通過protected修飾的變量,在實例對象上也是不可訪問的。
readonly
readonly表示該屬性只讀,初始化了之后就不能以任何方式修改,無論是在類內部,還是修改實例對象,但當它是一個對象時,只要不改變它的內存地址,修改對象的屬性是可以的。
訪問器
訪問器給私有屬性提供get/set方法,讓我們在類外部獲取/修改私有屬性
class Person { private _name: string; constructor(newName: string) { this._name = newName; } get name() { return this._name; } set name(newName) { if (newName) this._name = newName; } } const person = new Person("alice"); console.log(person.name); person.name = "kiki"; console.log(person.name); person.name = ""; console.log(person.name);
通過get/set屬性來修改私有屬性可以做到攔截/判斷的作用
靜態成員
靜態成員通過 static 關鍵字來定義,通過 static 定義的屬性,是定義在類自身的,只能通過自己訪問,在類內部和實例對象都是無法訪問到的。
抽象類
在定義很多通用的調用接口時,我們通常會讓調用者傳入父類,通過多態來實現更加靈活的調用方式。
但是,父類本身可能并不需要對某些方法進行具體的實現,所以父類中定義的方法, 我們可以定義為抽象方法。
abstract class Shape { abstract getArea(): void; } class Circle extends Shape { private radius: number; constructor(radius: number) { super(); this.radius = radius; } getArea() { return this.radius * this.radius * 3.14; } } class Rectangle extends Shape { private width: number; private height: number; constructor(width: number, height: number) { super(); this.width = width; this.height = height; } getArea() { return this.width * this.height; } } function calcArea(shape: Shape) { return shape.getArea(); } console.log(calcArea(new Circle(3))); console.log(calcArea(new Rectangle(2, 6)));
抽象方法和方法通過 abstract 來修飾,并且抽象類定義時有兩條規則:
- 抽象方法必須要在子類實現
- 抽象類是不能被實例化的
類的類型
類本身也是可以作為一種數據類型的,可以用作類型注解。
class Person { name: string = "alice"; eating() {} } const person: Person = { name: "kiki", eating() { console.log("i am eating"); }, }; function printPerson(person: Person) { console.log(person.name); } printPerson(new Person()); printPerson(person); printPerson({ name: "macsu", eating() {} });
只要符合類的格式,就可以使用類的類型
函數和類在JS和TS中都是至關重要的,可以幫助開發者更好規范開發時的代碼,減少線上故障~
總結
原文鏈接:https://blog.csdn.net/bingbing1128/article/details/123309953
相關推薦
- 2022-07-11 Verilog中$display和$write任務以及格式化輸出
- 2022-08-06 QT生成隨機驗證碼的方法_C 語言
- 2021-11-06 C/C++?Qt?StringListModel?字符串列表映射組件詳解_C 語言
- 2023-02-09 c++報錯問題解決方案lvalue?required?as?left?operand?of?assi
- 2022-08-10 Qt實現簡易計時器的示例代碼_C 語言
- 2022-10-23 Python中unittest的數據驅動詳解_python
- 2022-06-09 Nginx流量拷貝ngx_http_mirror_module模塊使用方法詳解_nginx
- 2023-04-19 vscode配置ESlint
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支