學(xué)習(xí) 之 TypeScript -- 基礎(chǔ)知識
1促绵、函數(shù): 函數(shù)定義
1.1、無返回值
function run(): void {
console.log('沒有返回值請使用void類型')
}
1.2嘴纺、返回值類型
// 返回字符串類型
function run2(): string {
return '返回字符串類型'
}
// 返回數(shù)字類型
function run3(): number {
return 1234
}
// 返回任意類型
function run4(): any {
return 123
}
1.3败晴、函數(shù)傳參
function getInfo(name: string, age: number): string {
return `${name}______${age}`
}
1.4、可選參數(shù)(可選參數(shù)必須現(xiàn)在最后面T钥省<饫ぁ!)
function getInfo2(name: string, age?: number): string {
if (age) {
return `${name}______${age}`
} else {
return `${name}_____年齡保密`
}
}
1.5闲擦、默認參數(shù)
function getInfo3(name: string, age: number = 20): string {
if (age) {
return `${name}______${age}`
} else {
return `${name}_____年齡保密`
}
}
1.6慢味、剩余參數(shù)(三點運算)
function sum(...result: number[]): number {
var sum = 0;
result.map(function (item, index) {
sum += item;
});
return sum
}
console.log(sum(12, 3, 4, 5))
1.8、函數(shù)重載
//(Java中重載墅冷,指的是兩個或者兩個以上的同名函數(shù)纯路,但他們的參數(shù)不一樣,這時會出現(xiàn)函數(shù)重載的情況)
//(TyprScript中重載俺榆,指的是通過一個函數(shù)提供多個函數(shù)類型定義,來試下多種功能的目的)
//ts為了兼容es5 或者 es6重載的寫法和java是有區(qū)別的
function getInfo(name: string): string;
function getInfo(age: number): string;
function getInfo(str: any): any {
if (str === 'string') {
return '我的名字:' + str
} else {
return '我的年齡:' + str
}
}
console.log(getInfo('張三')) // 正確寫法
console.log(getInfo(20)) // 正確寫法
console.log(getInfo(true)) //錯誤寫法
2装哆、類
class Person {
public name: string; // 屬性
constructor(n: string) { // 構(gòu)造函數(shù) 實例話會觸發(fā)
this.name = n;
}
getName(): string {
return this.name;
}
setName(name: string): void {
this.name = name;
}
}
let p = new Person('張三');
p.setName('李四')
console.log(p.getName())
3罐脊、繼承
class Person {
public name: string; // 屬性
constructor(n: string) { // 構(gòu)造函數(shù) 實例話會觸發(fā)
this.name = n;
}
getName(): string {
return this.name;
}
setName(name: string): void {
this.name = name;
}
run(str: string): string {
return str;
}
}
class Web extends Person {
constructor(name: string) {
super(name) // 繼承 -- 初始化父類構(gòu)造函數(shù)
}
run(str: string): string {
return str + " -- 子類方法";
}
}
let p = new Web('李五');
// 父類和子類有同樣方式時定嗓,實際調(diào)用的是子類方法(因為先從子類找方法,如果子類方法沒有萍桌,再往父類找)
console.log(p.run('李六'))
4宵溅、類的修飾符(屬性不加修飾符,默認為公有:public)
// public 公有: 在類里上炎、子類恃逻、類外都可以訪問
// protected 類保護: 在類里、子類可以訪問藕施,類外不可訪問
// private 私有:在當(dāng)前類里可以訪問寇损,在子類、類外不可訪問
// public(公有) 范例:
class Person {
public name: string; // 屬性
constructor(n: string) { // 構(gòu)造函數(shù) 實例話會觸發(fā)
this.name = n;
}
getName(): string {
console.log(this.name + '---- public范例 -- 類內(nèi)訪問')
return this.name;
}
setName(name: string): void {
this.name = name;
}
run(str: string): string {
return str;
}
}
class Web extends Person {
constructor(name: string) {
super(name) // 繼承 -- 初始化父類構(gòu)造函數(shù)
}
run(str: string): string {
console.log(this.name + '---- public范例 -- 子類訪問')
return str + " -- 子類方法";
}
}
let p = new Web('李五');
console.log(p.getName())
console.log(p.run('李六'))
console.log(p.name + "---- public范例 -- 類外訪問")
// protected(保護) 范例:
class Person {
protected name: string; // 屬性
constructor(n: string) { // 構(gòu)造函數(shù) 實例話會觸發(fā)
this.name = n;
}
getName(): string {
console.log(this.name + '---- public范例 -- 類內(nèi)訪問')
return this.name;
}
setName(name: string): void {
this.name = name;
}
run(str: string): string {
return str;
}
}
class Web extends Person {
constructor(name: string) {
super(name) // 繼承 -- 初始化父類構(gòu)造函數(shù)
}
run(str: string): string {
console.log(this.name + '---- public范例 -- 子類訪問')
return str + " -- 子類方法";
}
}
let p = new Web('李五');
console.log(p.getName())
console.log(p.run('李六'))
console.log(p.name + "---- public范例 -- 類外訪問") // 報錯
// private(私有) 范例:
class Person {
private name: string; // 屬性
constructor(n: string) { // 構(gòu)造函數(shù) 實例話會觸發(fā)
this.name = n;
}
getName(): string {
console.log(this.name + '---- public范例 -- 類內(nèi)訪問')
return this.name;
}
setName(name: string): void {
this.name = name;
}
run(str: string): string {
return str;
}
}
class Web extends Person {
constructor(name: string) {
super(name) // 繼承 -- 初始化父類構(gòu)造函數(shù)
}
run(str: string): string {
console.log(this.name + '---- public范例 -- 子類訪問') // 報錯
return str + " -- 子類方法";
}
}
let p = new Web('李五');
console.log(p.getName())
console.log(p.run('李六'))
console.log(p.name + "---- public范例 -- 類外訪問") // 報錯
5裳食、靜態(tài)方法
class Person {
public name: string;
public age: number = 20;
static sex: string = "男"
constructor(name: string) {
this.name = name
}
// 實例方法
run(str: string): string {
return str + "實例方法"
}
// 靜態(tài)方法 關(guān)鍵字: static(靜態(tài)方法 不能直接調(diào)用類里面都屬性)
static print(str: string): string {
console.log(this.age) // 報錯(因為使用了實力屬性)
console.log(this.sex) // 正確(因為使用了靜態(tài)屬性)
return str + "靜態(tài)方法"
}
}
console.log(Person.print('print'))
console.log(Person.sex)
let p = new Person('張三');
console.log(p.run('run'))
6矛市、多態(tài)
// 父級定義一個方法不去實現(xiàn),讓繼承它的子級方法是去實現(xiàn)诲祸,每個子類有不同的表現(xiàn)浊吏;多態(tài)屬于繼承
class Anial {
public name: string;
constructor(name: string) {
this.name = name;
}
eat() {
// 定義了一個吃的方法,具體吃什么救氯,由繼承的子類去實現(xiàn)找田,每個子類的表現(xiàn)不一樣
console.log("這是定義了一個吃的方法")
}
}
class Dog extends Anial {
constructor(name: string) {
super(name)
}
eat() {
return this.name + '吃狗糧'
}
}
class Cat extends Anial {
constructor(name: string) {
super(name)
}
eat() {
return this.name + "吃貓糧"
}
}
let d = new Dog("狗");
let c = new Cat("貓");
console.log(d.eat())
console.log(c.eat())
7、抽象類
// (它是提供其他類繼承的基類着憨,不能直接實例化)
// (使用abstract關(guān)鍵字定義抽象類和抽象方法墩衙,抽象類中的抽象方法不包含具體實現(xiàn)并且必須在派生中實現(xiàn))
// (abstract方法只能放在抽象類里面)
// (抽象類 和 抽象方法是用來定義標(biāo)準)
abstract class Anial {
public name: string;
constructor(name: string) {
this.name = name;
}
// 抽象方法(抽象方法只能出現(xiàn)在抽象類中!!!)
abstract eat(): any;
}
class Dog extends Anial {
constructor(name: any) {
super(name);
}
// 必須實現(xiàn)父類抽象方法!!!!
eat() {
return this.name + "吃狗糧"
}
}
class Cat extends Anial {
constructor(name: any) {
super(name);
}
run() {
return this.name + "吃貓糧"
}
}
let d = new Dog('狗');
let c = new Cat("貓");
console.log(d.eat())
console.log(c.run()) // 報錯:因為沒有實現(xiàn)父級的抽象方法
8、接口
8.1享扔、批量管理
interface FullName {
firstNmae: string;
secondName: string;
}
function printName(name: FullName) {
console.log(`${name.firstNmae} ---${name.secondName}`)
}
function printInfo(info: FullName) {
console.log(`${info.firstNmae} ---${info.secondName}`)
}
// printName({age:20,firstNmae:'張',secondName:'三'}) // 錯誤寫法: 因為直接在調(diào)用中寫底桂,只能有firstNmae和secondName并且是string類型
var obj = {
firstNmae: '張',
secondName: '三'
}
printName(obj); // 只種寫法,只要包含有 firstNmae和secondName并且是string類型
var info = {
firstNmae: '李',
secondName: '四'
}
printInfo(info);
8.2惧眠、可選屬性
interface FullName {
firstNmae: string;
secondName: string;
age?: number
}
function printInfo(info: FullName) {
console.log(`${info.firstNmae} ---${info.secondName}---${info.age ? info.age : ""}`)
}
let info = {
firstNmae: '李',
secondName: '四',
// age: 20
}
printInfo(info);