【问题标题】:Writing Typescript interface for a Class为类编写 Typescript 接口
【发布时间】:2016-10-27 18:27:21
【问题描述】:

我正在阅读 Typescript 手册的 Class Types 部分,我对如何编写类的接口定义感到困惑。从文档中,我了解到可以使用接口来描述类的“实例”端。但是您将如何编写描述类的“静态”方面的接口?

这是一个例子:

interface IPerson {
    name: string;
    getName(): string;
}

class Person implements IPerson {
    public name: string;

    constructor(name: string) {
        this.name = name;
    }

    public getName() {
        return this.name;
    }
}

在这个例子中,你将如何修改IPerson,以便也可以描述构造函数?

【问题讨论】:

    标签: javascript typescript typescript1.8


    【解决方案1】:

    您可以根据自己的静态需求创建单独的界面:

    interface IPerson {
        name: string;
        getName(): string;
    }
    
    class Person implements IPerson {
        public name: string;
    
        constructor(name: string) {
            this.name = name;
        }
    
        public getName() {
            return this.name;
        }
    
        public static create(name: string) { // method added for demonstration purposes
            return new Person(name);
        }
    }
    

    静态界面:

    interface IPersonStatic {
        new(name: string); // constructor
        create(name: string): IPerson; // static method
    }
    
    let p: IPersonStatic = Person;
    

    另外,您可以使用typeof 来确定类型:

    let p2: typeof Person = Person; // same as 'let p2 = Person;'
    let p3: typeof Person = AnotherPerson;
    

    【讨论】:

    • 你能解释一下let p: IPersonStatic = Person是什么意思吗?这是将p 变量设置为引用Person 类吗?
    • @wmock Person 类声明创建了两个称为 Person 的东西 - 1) 一个类型和 2) 一个变量,该变量引用构造 Person 的函数(并且应该被称为带有new 前缀,即构造函数)。他们感到困惑没有问题,因为在 TS 中,您的代码总是肯定在谈论类型或值,而不是两者。所以变量Person 就像const 类型的Person,并且可以分配给任何结构兼容类型的变量。
    【解决方案2】:

    我在您的示例中添加了IPersonConstructor。其余部分相同;只是为了清楚起见。

    new (arg1: typeOfArg1, ...): TypeOfInstance; 描述了一个类,因为它可以用new 调用并返回该类的一个实例。

    interface IPerson {
        name: string;
        getName(): string;
    }
    
    class Person implements IPerson {
        public name: string;
    
        constructor(name: string) {
            this.name = name;
        }
    
        public getName() {
            return this.name;
        }
    }
    
    interface IPersonConstructor {
        // When invoked with `new` and passed a string, returns an instance of `Person`
        new (name: string): Person;
        prototype: Person;
    }
    

    【讨论】:

      【解决方案3】:

      通用的怎么样

      interface IConstructor<T> extends Function {
          new (...args: any[]): T;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 1970-01-01
        • 2013-09-19
        • 2019-03-04
        • 2014-08-21
        • 2019-12-07
        • 2017-05-28
        • 2015-07-27
        • 2021-12-09
        相关资源
        最近更新 更多