一、ts中类的定义

  1. <script lang="ts">
  2. import { defineComponent } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. class Person {
  7. age: number;
  8. name: string;
  9. constructor(age: number, name:string) {
  10. this.age = age;
  11. this.name = name;
  12. }
  13. getName (): string {
  14. return this.name;
  15. }
  16. setName(name: string): void {
  17. this.name = name;
  18. }
  19. }
  20. const p = new Person(18, '张三');
  21. alert(p.age) // 18
  22. p.setName('李四')李四
  23. alert(p.getName()) // 李四
  24. return { p }
  25. },
  26. });
  27. </script>
  1. class Person{
  2. /* 实例的name */
  3. name:string
  4. age:number
  5. getName():void{
  6. console.log(this.name);
  7. }
  8. }
  9. var p:Person = new Person();
  10. p.getName();
  11. //当没有构造函数的时候,代码底层有自动补全构造函数

二、类的继承 —>extends、super()

1、子类可以继承父类的属性和方法,也可以定义自己的属性和方法

2、当子类的属性和方法与父类冲突时,子类会调用自己的方法和属性

  1. <script lang="ts">
  2. import { defineComponent } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. class Person {
  7. name: string;
  8. constructor(name: string) {
  9. this.name = name;
  10. }
  11. getName(): string {
  12. return `父类:this.name`;
  13. }
  14. }
  15. class Son extends Person { // extends:Son继承Person的类
  16. constructor(name: string) {
  17. super(name); // 当传入name时,super()调用父类的构造函数初始化name值
  18. }
  19. getName(): string {
  20. return `子类:this.name`;
  21. }
  22. work() {
  23. alert('子类的方法'); // 子类自己的方法
  24. }
  25. }
  26. const s = new Son('李四');
  27. alert(s.getName()); // 父类:李四--(当子类没有此方法时)
  28. alert(s.getName()); // 子类:李四--(当子类有和父类一样的方法时,会调用子类的方法)
  29. return { s };
  30. },
  31. });
  32. </script

三、类里面的修饰符

属性如果不加修饰符,默认是公有类型(public)

1、public:公有, 在类里面、子类、类外面都可以访问

  1. <script lang="ts">
  2. import { defineComponent } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. class Person {
  7. public name: string;
  8. constructor(name: string) {
  9. this.name = name;
  10. }
  11. getName(): string {
  12. return this.name; // 类里面访问
  13. }
  14. }
  15. // const p = new Person('李四');
  16. // console.log(p.name) // 李四 --> 类外面访问
  17. class Son extends Person {
  18. constructor(name: string) {
  19. super(name);
  20. },
  21. work() {
  22. console.log(this.name) // 李四 --> 子类里面访问
  23. }
  24. }
  25. const s = new Son('李四');
  26. },
  27. });
  28. </script>

2、protected:保护类型, 在类里面、子类里面可以访问, 类外面不能访问

  1. <script lang="ts">
  2. import { defineComponent } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. class Person {
  7. protected name: string;
  8. constructor(name: string) {
  9. this.name = name;
  10. }
  11. getName(): string {
  12. return this.name; // 类里面访问
  13. }
  14. }
  15. // const p = new Person('李四');
  16. // console.log(p.name) // --> 类外面访问 -- > ts语法会报错
  17. class Son extends Person {
  18. constructor(name: string) {
  19. super(name);
  20. },
  21. work() {
  22. console.log(this.name) // 李四 --> 子类里面访问
  23. }
  24. }
  25. const s = new Son('李四');
  26. },
  27. });
  28. </script>

3、private:私有, 在类里面可以访问,子类、类外面不能访问

  1. <script lang="ts">
  2. import { defineComponent } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. class Person {
  7. private name: string;
  8. constructor(name: string) {
  9. this.name = name;
  10. }
  11. getName(): string {
  12. return this.name; // 类里面访问
  13. }
  14. }
  15. // const p = new Person('李四');
  16. // console.log(p.name) // --> 类外面访问 -- > ts语法会报错
  17. class Son extends Person {
  18. constructor(name: string) {
  19. super(name);
  20. },
  21. work() {
  22. console.log(this.name) // --> 子类里面访问 -- > ts语法会报错
  23. }
  24. }
  25. const s = new Son('李四');
  26. },
  27. });
  28. </script>

4、类的静态属性、方法

static:定义静态属性、方法

  1. //static修饰的变量是类所共有的,只能通过类名去调用。
  2. <script lang="ts">
  3. import { defineComponent } from 'vue';
  4. export default defineComponent({
  5. name: 'Test',
  6. setup() {
  7. class Person {
  8. private name: string;
  9. static sex = '男'; // 静态属性
  10. constructor(name: string) {
  11. this.name = name;
  12. }
  13. getName(): string {
  14. return Person.sex; // 静态属性只能通过类名去调用
  15. }
  16. static getSex(val: string): string { // 静态方法,其中无法直接调用类的属性
  17. return val + Person.sex;
  18. }
  19. }
  20. alert(Person.getSex('李四'));
  21. alert(Person.sex);
  22. },
  23. });
  24. </script>

四、属性类型接口类函数

即:定义接口的传参类型

  1. <script lang="ts">
  2. import { defineComponent, onMounted } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. // 定义接口的传参
  7. interface userInfo {
  8. name: string;
  9. age: number;
  10. sex?: string; // ? --> 表示可选参数(传与不穿都可以)
  11. data: object
  12. }
  13. const info = {
  14. name: '张三',
  15. age: 18,
  16. sex: '男',
  17. data: {num: 1, str: 'xx'}
  18. };
  19. // 接口函数
  20. // 1、info: userInfo --> info内的参数必须符合userInfo中的类型
  21. // 2、参数顺序没有限制
  22. const getUserInfo = (info: userInfo) => {
  23. console.log(info.name, info.age, info.sex, info.data);
  24. };
  25. onMounted(() => {
  26. getUserInfo(info);
  27. });
  28. },
  29. });
  30. </script>

五、泛型

1、泛型函数

  1. <script lang="ts">
  2. import { defineComponent, onMounted } from 'vue';
  3. export default defineComponent({
  4. name: 'Test',
  5. setup() {
  6. // 箭头函数-定义泛型(必须要return)
  7. const getData = <T> (value: T): T => {
  8. console.log(value);
  9. return value
  10. }
  11. // 普通函数-定义泛型
  12. // function getData<T>(value: T): T {
  13. // return value;
  14. // }
  15. onMounted(() => {
  16. getData<number>(123); // 传入的参数必须和定义的函数类型一致
  17. })
  18. },
  19. });
  20. </script>

2、泛型类

  1. <template></template>
  2. <script lang="ts">
  3. import { defineComponent, onMounted } from 'vue';
  4. export default defineComponent({
  5. name: 'Test',
  6. setup() {
  7. // 泛型类
  8. class MinClass<T> {
  9. public list: T[] = [];
  10. add(val: T): void {
  11. this.list.push(val);
  12. }
  13. min(): T {
  14. var minNum = this.list[0];
  15. for (var i = 0; i < this.list.length; i++) {
  16. if (minNum > this.list[i]) {
  17. minNum = this.list[i];
  18. }
  19. }
  20. return minNum;
  21. }
  22. }
  23. onMounted(() => {
  24. const findNum = new MinClass<number>(); // 实例化类,并且制定了类的T代表的类型是number
  25. findNum.add(2);
  26. findNum.add(10);
  27. findNum.add(20);
  28. console.log(findNum.min()); // 最小值
  29. });
  30. },
  31. });
  32. </script>

本文来自

Vue

已关注