• 类的使用 重写父类方法 类中的修饰符 get 读取字段 set 对字段进行修改 抽象类(抽象 成员) 2.8类的初始化顺序


    this当前类

    实例化对象   let p = new person("" ,  )

    为什么在实例化的时候赋值 

    因为上面使用了构造函数,

    1. export default {}
    2. class Person {
    3. // 字段
    4. name: string
    5. age: number
    6. // 构造函数
    7. constructor(name: string, age: number) {
    8. this.name = name
    9. this.age = age
    10. }
    11. // 函数
    12. setHello(): void {
    13. console.log(`我叫${this.name}我今年${this.age}`);
    14. }
    15. }
    16. let q = new Person("张三", 23)
    17. console.log(q);

    重写父类方法   

    1. export default {}
    2. class Person {
    3. // 字段
    4. name: string
    5. age: number
    6. // 构造函数
    7. constructor(name: string, age: number) {
    8. this.name = name
    9. this.age = age
    10. }
    11. // 函数
    12. setHello(): void {
    13. console.log(`我叫${this.name}我今年${this.age}`);
    14. }
    15. }
    16. // let q = new Person("张三", 23)
    17. // console.log(q);
    18. // q.setHello()
    19. class Zilei extends Person {
    20. // 字段
    21. score: string
    22. // 构造函数
    23. constructor(name: string, age: number, score: string) {
    24. super(name, age)
    25. this.score = score
    26. }
    27. // 函数
    28. set(): void {
    29. // 父级的函数
    30. // super.setHello()
    31. // 重写父类的方法
    32. console.log(`我叫${this.name}我今年${this.age},我考了${this.score}`);
    33. }
    34. }
    35. let w = new Zilei("张四", 23, "甲")
    36. w.set()

    static 与 instanceof

     

    1. export default {}
    2. class Fn {
    3. static salary: string = "张三"
    4. static say(): void {
    5. console.log(`我叫${this.salary}`);
    6. }
    7. }
    8. Fn.say()
    9. class Person { }
    10. let p = new Person()
    11. let b = p instanceof Person;
    12. console.log("p是Person实例化出来的吗?", b);
    13. class Student extends Person { }
    14. let s = new Student();
    15. let d = s instanceof Person;
    16. console.log("s是Person实例化出来的吗?", d);

    类中的修饰符  

    1. export default {}
    2. class Person {
    3. // 字段
    4. public name: string
    5. protected age: number
    6. private sex: string
    7. // 构造函数
    8. constructor(name: string, age: number, sex: string) {
    9. this.name = name
    10. this.age = age
    11. this.sex = sex
    12. }
    13. // 函数
    14. setHello(): void {
    15. console.log(`我叫${this.name}我性别${this.sex}今年${this.age}`);
    16. }
    17. }
    18. let q = new Person("张三", 23, "男")
    19. q.setHello()
    20. class Zilei extends Person {
    21. // 字段
    22. score: string
    23. // 构造函数
    24. constructor(name: string, age: number, sex: string, score: string) {
    25. super(name, age, sex)
    26. this.score = score
    27. }
    28. // 函数
    29. set(): void {
    30. console.log(this.name);
    31. console.log(this.age);
    32. // console.log(this.sex); //因为上面是私有属性 不能使用继承所以报错
    33. console.log(this.score);
    34. }
    35. }
    36. let w = new Zilei("张四", 23, "男", "甲")
    37. w.set()

    readonly用于标记一个属性是只读的,也就是不可修改的。

    1. export default {}
    2. class Print {
    3. // readonly 只读属性必须在声明时
    4. readonly str1: string = "我是声明 时赋的值"
    5. readonly str2: string
    6. readonly str3: string
    7. readonly str4: string
    8. readonly str5: string
    9. readonly str6: string
    10. constructor(str2: string, str3: string, str4: string, str5: string, str6: string) {
    11. this.str2 = str2
    12. this.str3 = str3
    13. this.str4 = str4
    14. this.str5 = str5
    15. this.str6 = str6
    16. }
    17. }
    18. let str = new Print("嗡嗡嗡", "哇哇哇", "呜呜呜", "喂喂喂", "我我我")
    19. console.log(str);

    get  读取字段    set 对字段进行修改   

    1. export default {}
    2. class Name {
    3. // 私有的字段
    4. private myName: string = "张三"
    5. // 读取字段的值 取值
    6. get fullName() {
    7. console.log("get");
    8. return this.myName;
    9. }
    10. // 为字段赋值 (修改)
    11. set fullName(newName: string) {
    12. // console.log("set");
    13. this.myName = newName
    14. }
    15. }
    16. let n = new Name()
    17. n.fullName = "赵四" //修改赋值
    18. console.log(n); //修改
    19. // console.log(n.fullName); //取值

    抽象类(抽象 成员) 

    抽象类作为其他派生类的基类的使用,他们一般不会直接被实例化

    抽象类专门用于定义那些不希望被外界 直接创建的类的

    抽象类和接口一样用于约束子类

    抽象类和接口类的区别:

    抽象方法必须包含,abstract关键字并且可以包含访问修饰符

    接口中只能定义约束不能定义具体实现,而抽象类中既可以定义约束,又可以定义具体实现

    1. export default {}
    2. // 父类
    3. abstract class Fn {
    4. abstract name: string
    5. abstract age: number
    6. abstract show(): string
    7. // void 没有返回值
    8. strNname(): void {
    9. console.log("我叫张三");
    10. }
    11. }
    12. // 子类
    13. class Str extends Fn {
    14. name: string = "张三"
    15. age: number = 34
    16. show() {
    17. return "我是赵四"
    18. }
    19. }
    20. let s = new Str()
    21. let q = s.show()
    22. console.log(q);

     implements子句

    类继承多个接口

    1. export default {}
    2. // 接口
    3. interface Fu {
    4. name: string
    5. age: number
    6. sex: string
    7. show(): void
    8. }
    9. // 接口
    10. interface Xiong {
    11. each: string
    12. }
    13. // 类
    14. // 类继承一个接口 implements
    15. class Zi implements Fu, Xiong {
    16. name: string = "张三";
    17. age: number = 32;
    18. sex: string = "男";
    19. each: string = "吃饭";
    20. show() {
    21. console.log(`我叫${this.name}今年${this.age}`);
    22. }
    23. }
    24. let n = new Zi()
    25. n.show()

    继承一个类  同时可以继承一个接口

    接中不能在里面提供实现赋值的

    1. export default {}
    2. // 接口
    3. interface Fu {
    4. name: string
    5. age: number
    6. sex: string
    7. show(): void
    8. }
    9. // 接口
    10. interface Xiong {
    11. each: string
    12. }
    13. // 类
    14. // 类继承一个接口 implements
    15. class Zi implements Fu, Xiong {
    16. name: string = "张三";
    17. age: number = 32;
    18. sex: string = "男";
    19. each: string = "吃饭";
    20. show() {
    21. console.log(`我叫${this.name}今年${this.age}`);
    22. }
    23. }
    24. let n = new Zi()
    25. n.show()
    26. // 接口继承一个类
    27. interface Lei extends Zi {
    28. // name:string = "ss" 类不可以赋值
    29. name: string
    30. }
    31. // 继承一个 类  同时可以继承一个接口
    32. class Star extends Zi implements Lei {
    33. name: string = "张四"
    34. age: number = 12;
    35. sex: string = "男";
    36. each: string = "吃不饱";
    37. }
    38. let p = new Star()
    39. console.log(p.name);

    2.8类的初始化顺序

    1. export default {}
    2. class Fu {
    3. name: string = "张三"
    4. age: number = 34
    5. constructor() {
    6. console.log(`我叫${this.name}我今年${this.age}`);
    7. }
    8. }
    9. class Zi extends Fu {
    10. name: string = "张四"
    11. age: number = 54
    12. constructor() {
    13. super()
    14. console.log(`我叫${this.name}今年${this.age}`);
    15. }
    16. }
    17. let s = new Zi

    泛型的基本使用 (支持多个数据类型)        

    1. export default {}
    2. // 简单的数组
    3. // const arr: string[] = ["嗡嗡嗡", "喂喂喂", "呜呜呜"]
    4. // console.log(arr);
    5. // const arr1: number[] = [1, 2, 3, 4, 5, 6]
    6. // console.log(arr1);
    7. // const arr2: Array = [1, 2, 3, 4, 5, 6]
    8. // console.log(arr2);
    9. // const arr3: Array = ["嗡嗡嗡", "喂喂喂", "呜呜呜"]
    10. // console.log(arr3);
    11. // let arrArray = (value: number, item: number): number[] => {
    12. // return new Array(item).fill(value)
    13. // }
    14. // let arr4 = arrArray(1, 3)
    15. // console.log(arr4);
    16. let arrArray = (value: T, item: number): T[] => {
    17. return new Array(item).fill(value)
    18. }
    19. let arr4 = arrArray("sss", 3)
    20. console.log(arr4);

    泛型的约束

    1. export default {}
    2. // function Get(e:T):T{
    3. // console.log(e.length); //类型“T”上不存在属性“length”。
    4. // return e
    5. // }
    6. // function Get(e: Array): Array {
    7. // console.log(e.length);
    8. // return e
    9. // }
    10. // // Get("ss") //类型“string”的参数不能赋给类型“unknown[]”的参数。
    11. // Get(["sss","sss","ss"])
    12. // Get([1,2,3,4])
    13. interface Len {
    14. length: number
    15. }
    16. // 通过继承接口的方式来 加上length
    17. function Gerextends Len>(e: T): T {
    18. return e
    19. }
    20. Ger("ss")
    21. Ger(["sss", "sss", "ss"])
    22. Ger([1, 2, 3, 4])

     泛型接口

    将泛型与接口结合起来使用,可以大大简化我们的代码,增强 我们 的代码的可读性 

    反省也可以使用默认值

    1. export default {}
    2. // interface Iperson {
    3. // name: T1
    4. // age: T2
    5. // }
    6. // let Name: Iperson = {
    7. // name: "张三",
    8. // age: 34
    9. // }
    10. // 简写
    11. interface Iperson<T1 = string, T2 = number> {
    12. name: string
    13. age: number
    14. }
    15. let Name: Iperson = {
    16. name: "张三",
    17. age: 34
    18. }

    泛型的改造

    1. export default {}
    2. class Arr<T1, T2>{
    3. // 字段 (属性)
    4. name: T1
    5. age: T2
    6. sex: T1
    7. // 构造函数
    8. constructor(name: T1, age: T2, sex: T1) {
    9. this.name = name
    10. this.age = age
    11. this.sex = sex
    12. }
    13. }
    14. // 实例化对象
    15. let q = new Arr("李四", 19, "男")
    16. console.log(q);

     其他类型的补充 

    1. export default {}
    2. // 任何类型都可以赋值给unknown类型
    3. let Mytype1: unknown;
    4. Mytype1 = "李四";
    5. Mytype1 = true;
    6. Mytype1 = 34
    7. // 不能将unknown类型赋值给其他类型
    8. let Mytype2: unknown = 18;
    9. let num: number;
    10. // 类型缩小
    11. if (typeof Mytype2 == "number") {
    12. num = Mytype2
    13. }
    14. // 类型断言
    15. num = Mytype2 as number
    16. // Mytype2 = num //报错 不能将unknown类型赋值给其他类型
    17. // unknown 类型与其他类型组成的交叉类型都是其他类型
    18. type Mytype3 = unknown & number
    19. let number: Mytype3 = 34
    20. // let number1:Mytype3="ss" //报错 他会变成 数字类型number
    21. // unknown 除了与any之外 与其他类型组合的联合类型都是unknown类型
    22. type Mytype4 = unknown | any
    23. type Mytype5 = unknown | number
    24. type Mytype6 = unknown | number | string
    25. // never类型是unknown类型的子类型
    26. type Mytype7 = never extends unknown ? true : false

    Map类型

    1. export default {}
    2. // Map类型
    3. let nameMap = new Map()
    4. // 设置Map对象
    5. nameMap.set("李四", 1)
    6. nameMap.set("王五", 2)
    7. nameMap.set("老六", 3)
    8. // 获取对象的键值
    9. // console.log(nameMap.get("李四")); //1
    10. // 判断Map里面是否包含键对应的值
    11. // console.log(nameMap.has("李四")); //true
    12. // 判断Map键对应值的数量
    13. // console.log(nameMap.size); //3
    14. // 判断一处Map里面所有的键值对
    15. // nameMap.clear()
    16. // console.log(nameMap); //Map(0) {}
    17. // // 迭代Map里面的key
    18. // for (const key of nameMap.keys()) {
    19. // console.log(key); //李四 王五 老六
    20. // }
    21. // // 迭代Map里面的value
    22. // for (const value of nameMap.values()) {
    23. // console.log(value); //1 2 3
    24. // }
    25. // 迭代Map中的key=>value
    26. for (const entry of nameMap.entries()) {
    27. console.log(entry);
    28. }
    29. // 适用对象解析
    30. for (const [key, value] of nameMap) {
    31. console.log(key, value);
    32. }

    条件类型    

    1. export default {}
    2. type Mytype = T extends string ? string : any
    3. type res = Mytype
    4. interface IName {
    5. name: string
    6. }
    7. interface TAge {
    8. name: number
    9. }
    10. type Condition = T extends string ? IName : TAge
    11. function reLoadextends number | string>(idOrNmae: T): Condition {
    12. throw ""
    13. }
    14. let res1 = reLoad("三十三")
    15. let res2 = reLoad(34)
    16. console.log(res1);
    17. console.log(res2);

    映射类型  

    1. export default {}
    2. type Name = "person" | "animal"
    3. type Person = {
    4. name: string
    5. age: number
    6. }
    7. type NewType = Record<Name, Person>;
    8. let res: NewType =
    9. {
    10. person: {
    11. name: "富兰克林",
    12. age: 16
    13. },
    14. animal: {
    15. name: "小查",
    16. age: 3
    17. }
    18. }
    19. console.log(res);
    20. interface TPerson {
    21. name: string
    22. age: number
    23. }
    24. type Mytype = Pick<TPerson, "name">
    25. let res2: Mytype = {
    26. name: "崔弗"
    27. }

    装饰器  

    装饰器的主要作用是给一个已有的方法或类扩展一些新的行为,而不去直接修改他的本身

    1.要先修改  tsconfig.json文件

    案例

    1. export default {}
    2. function fn(constructure: any) {
    3. constructure.prototype.name = "李四"
    4. constructure.prototype.show = () => {
    5. console.log(`我叫${constructure.prototype.name}`);
    6. }
    7. }
    8. @fn
    9. class Person {
    10. }
    11. let n = new Person();
    12. (n as any).show();
    13. console.log((n as any).name);

    装饰器工厂  

    装饰器工厂也是一个函数,它的返回值是一个函数,返回的函数作为修饰器的调用函数,如果使用装饰器工厂,那么在使用的时候就要加上函数的调用​​​​​​​

    1. export default {}
    2. function fn(flag: boolean) {
    3. if (flag) {
    4. return function (constructure: any) {
    5. constructure.prototype.name = "李四"
    6. constructure.prototype.show = (): void => {
    7. console.log(`我叫${constructure.prototype.name}`);
    8. }
    9. }
    10. } else {
    11. return function (constructure: any) {
    12. constructure.prototype.show = (): void => {
    13. console.log("hello world");
    14. }
    15. }
    16. }
    17. }
    18. @fn(false)
    19. class Person {
    20. }
    21. let n = new Person();
    22. (n as any).show();
    23. // console.log((n as any).name);

    混入Mixins    

    介绍:除了传统的面向对象继承方式,还流行一种通过可重用组件类的方式,就是联合另一种简单类的代码

    作用:解决TS中继承一次只能 继承一个类的问题

    注意点:类的混入不能混入属性名

     

    1. export default {}
    2. let str = { name: "李四" };
    3. let num = { age: 34 };
    4. // Object.assign(str, num);
    5. // console.log(str);
    6. // console.log(num);
    7. Object.assign(num, str);
    8. console.log(str);
    9. console.log(num);

    模块与命名空间

    TS中的模块

    1. import Text = require("./muduleText")
    2. class Person implements Text.str {
    3. name = "李四"
    4. age = 34
    5. sex = "男"
    6. show() {
    7. console.log(`他叫${this.name}今年${this.age}岁性别${this.sex}`);
    8. }
    9. }
    10. var p = new Person()
    11. console.log(p);
    12. // 直接在公共ts里面赋值 在这里引用
    13. import { nae } from "./muduleText";
    14. console.log(nae);

     公共样式 

    1. export interface str {
    2. name: string
    3. age: number
    4. sex: string
    5. show(): void
    6. }
    7. export let nae = { uname: "王五" }

    TS中的命名空间

    在TS1.5之前被 叫做内部模块主要用于组织代码,避免命名冲突

    本质就是一个定义一个大对象,把变量方法类接口...都放到里面

    通过export导出

    通过namespace定义

    1. namespace A {
    2. export const a = 100
    3. export namespace B {
    4. export const b = 200
    5. }
    6. }
    7. namespace Q {
    8. export const a = 100
    9. export namespace B {
    10. const b = 200
    11. }
    12. }
    13. // 1
    14. console.log(A.a); //100
    15. // 简化命名空间
    16. import b = A.B.b
    17. console.log(b); //100
    18. // 3
    19. import { W } from "./namespaceText";
    20. console.log(W.w);

    公共样式 

    1. export namespace W {
    2. export const w = 10000;
    3. }

  • 相关阅读:
    英语六级-day9
    下一代Ajax技术 — Fetch的学习与使用
    Activiti第二部分
    【SCI征稿】2区数字技术、供应链网络、人工智能、工业物联网智能传感器等领域,进展超顺,仅3个月左右录用
    【Kingbase8数据库】flowable兼容人大金仓Kingbase8过程
    滴滴 - eta(Estimate the Travel Time)
    【技术积累】算法中的动态规划【二】
    Docker之构建镜像
    设计模式 | 单例模式
    [思维模式-5]:《如何系统思考》-1- 认识篇 - 总体结构与知识框架
  • 原文地址:https://blog.csdn.net/red_HTML/article/details/126763589