首页 > 解决方案 > 键入类,以便每个方法都必须是“getter”

问题描述

我有兴趣创建一个每个方法都必须是 getter 的类。这可能吗?

有效的:

class Example implements AllGetters {
  get alpha () {
  }
  get beta () {
  }
}

无效的:

class Example implements AllGetters {
  get alpha () {
  }
  beta () {
  }
}

标签: typescript

解决方案


可以使用Exclude泛型类型:

type AllGetters<T> = {
    [k in keyof T]: Exclude<T[k], Function>
}

class A implements AllGetters<A> {
    // simple properties: OK
    a: string = 'foo';
    b: number = 1;

    // type error: type '() => number' is not assignable to type 'never'.
    c(): number {
        return 2;
    }

    // getter: OK
    get d(): string {
        return 'hi';
    }

    // getter: not OK because it returns a function
    // type error: type 'Function' is not assignable to type 'never'.
    get e(): Function {
        return console.log;
    }
}

注意事项:

  • 简单属性和 getter 在类型上没有区别;您只是说所有方法都必须是 getter,所以这对于您的用例应该没问题。
  • 也不允许返回函数的 getter,因为 this 和方法在类型上没有区别。

游乐场链接


推荐阅读