zoukankan      html  css  js  c++  java
  • [TypeScript] Interface and Class

    When to use Interface and when to use Class.

    Let's see one example:

    export interface Lesson {
     courseId: string;
     description: string;
     duration?: string;
     longDescription?: string;
     tags: string | string[];
     url?: string;
     videoUrl: string;
     }
    
    export class Lesson {
      constructor(
                  public courseId: string,
                  public description: string,
                  public duration: string,
                  public longDescription: string,
                  public tags: string | string[],
                  public url: string,
                  public videoUrl: string) {
      }
    }

    We have an Interface 'Lesson' and a Class 'Lesson'. At this point, I would love to say, there is no differece between using interface or using Class. Actually I prefer Interface in this case, because its short-hand syntax.

    We when you want to add more functionalities, you need to using Class instead of Interface.

    For example:

    export class Lesson {
      constructor(public $key: string,
                  public courseId: string,
                  public description: string,
                  public duration: string,
                  public longDescription: string,
                  public tags: string | string[],
                  public url: string,
                  public videoUrl: string) {
      }
    
      get hasVideoUrl() {
        return !!this.videoUrl;
      }
    
      get hasMultiTags() {
        if (this.tags instanceof Array) {
          return true;
        } else {
          return false;
        }
      }
    
      static fromJsonList(array): Lesson[] {
        return array.map(Lesson.fromJson);
      }
    
      static fromJson({
        $key,
        courseId,
        description,
        duration,
        longDescription,
        tags,
        url,
        videoUrl
      }): Lesson {
        return new Lesson($key,
          courseId,
          description,
          duration,
          longDescription,
          tags,
          url,
          videoUrl)
      }
    }

    We add two getter and setter, hasMuliTags and hasVideoUrl. Basiclly we add two more props into the class dynamically based on other props.

    'fromJson' & 'formJsonList' are two static function, which helps to stucture our Lesson instance, in Angualr2 we can use like this:

    // Service
    
    @Injectable()
    export class CourseService {
      lessons$: FirebaseListObservable<Lesson[]>;
    
      constructor(private rt: RealtimeService) {
        this.lessons$ = rt.getLessonObs();
      }
    
      getLessons() {
        return this.lessons$
          .map(Lesson.fromJsonList);
      }
    }
  • 相关阅读:
    基于Asp.Net webApi owin oauth2的实现
    动态赋值
    C#生成二维码
    深度学习中反卷积层(转置卷积)引起的棋盘格噪声
    batch normalization 批归一化 --- 一个硬币的两面
    FFMPEG常用命令-格式转换-持续更新中
    [译]CRF和QP的区别
    读懂NCHW和NHWC
    [译]GPUView
    有一次接口设计
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5935369.html
Copyright © 2011-2022 走看看