javascript - 如何在 typescript 中键入一个动态加载其自己的成员的类

标签 javascript class typescript types

您好,我使用的是 typescript 2.1.4,但遇到了这个问题。

假设我有一个看起来像这样的对象

interface IObj{
    key1:ISubObj;
}
interface ISubObj{
    exp:RegExp;
    method:(param:string)=>boolean
}
const obj:IObj={
    key1: {
        exp: /someexp/i,
        method: somemethod
    }
}

somemethod看起来像这样

function somemethod(regexp){
   return function(param){
       return regexp.test(param)
   }
} 

在类型脚本中,我创建了一个如下所示的类

export class someClass {
 constructor(obj) {
    for (let k in obj) {
        this[k]=obj[k].method(obj[k].exp)
    }
    return this;
 }
}
export const Foo = new someClass(obj);

我遇到的问题是,它解析为有效的 javascript 但是,使用 Foo.key1(param) 返回类型 error 。 Foo 上不存在 key1

我在类上使用了 implements someInterface,但只有当我使用 key1 作为可选时,该接口(interface)才有效。我不想使用可选语法

interface someInterface {
    key1?:(param:string)=>boolean
}
export class someClass implements someInterface{...}

有没有办法在动态构造的类上创建有效类型?

编辑

更正了 obj 未传递到构造函数中的拼写错误

编辑

使用@toskv回答,我稍微改变了我的解决方案以获得我想要的效果。但这可能不是最好的方法

interface IObj{
    key1:ISubObj;
}
interface ISubObj{
    exp:RegExp;
    method:(param:string)=>boolean
}
const obj:IObj={
    key1: {
        exp: /someexp/i,
        method: somemethod
    }
}
export interface ISomeClass{
   key1:(str:string)=>boolean;
}
export type TSomeClass<T> = {
    [P in keyof T]?=T[P]
}
export class someClass {
 constructor(obj) {
    for (let k in obj) {
        this[k]=obj[k].method(obj[k].exp)
    }
    return this;
 }
}
export const Foo:TSomeClass<ISomeClass> = new someClass(obj);

最佳答案

可能有更好的方法来做到这一点,但这里有一些可以开始的东西。

您可以使用2.1中添加的ma​​ppedTypes来创建基于IObj接口(interface)的新类型。

interface IObj {
  key1: ISubObj;
}
interface ISubObj {
  exp: RegExp;
  method: (param: string) => boolean
}

type Result = {
  // must be optional so we can initialize it with nothing
  [P in keyof IObj]?: boolean
}

class Mine {
  // it's not really a property of the class but hey it's typed
  public results: Result = {};

  constructor(obj: IObj) {
    for (let k in obj) {
      this.results[k] = obj[k].method(obj[k].exp)
    }
    return this;
  }
}

// autocomplete and everything
new Mine(null).results.key1 

Here这是 Playground 上的一个例子。

您可以在2.1 release notes中阅读有关映射类型的更多信息。 .

在这种情况下,该类实际上没有意义。转换数据的函数也同样有效。

function testIObj(obj: IObj): Result {
  let results: Result = {};
  for (let k in obj) {
    results[k] = obj[k].method(obj[k].exp)
  }
  return results;
}


testIObj(null).key1;

这使您可以做一些好事,例如轻松处理整个列表。

如果方法函数将返回不同的类型,那么扩展以适应它们也相对容易。

 type Result = {
      // must be optional so we can initialize it with nothing
      [P in keyof IObj]?: boolean | number
    }

关于javascript - 如何在 typescript 中键入一个动态加载其自己的成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549345/

相关文章:

类中的 Typescript 联合类型

javascript - 动画 - jQuery - 带有延迟的 fadeInUp

CSS:为 'position: relative' 、 'position: fixed' 等使用一个类——这是个好主意吗?

java - 将类(class)转换到自制类(class)

python - 在 Python 中定义一个带有可选参数的类

typescript - 有没有办法以数字形式获取元组的键?

javascript - 替换对象并保留指向该对象的现有指针

javascript - 如何构建 sails.js 离线文档?

javascript - 供迷恋 Flex 开发人员使用的 HTML5 框架

angular - 当元素进入 View 时触发 CountUp 功能