使用TypeScript

时间:2018-07-22 17:03:07

标签: javascript typescript

我有一个返回代理的函数,该代理使用get陷阱来从多个对象推断函数。现在,我需要能够键入这些函数,因为它们在编译时在技术上是众所周知的,但TypeScript只是无法弄清楚它们。如何让TypeScript识别这些功能以将它们添加到我的界面中?

interface IObject {
  (): IFunction;
  addAMethod(name: string, fn: (...args: any[]) => any): void;
}

interface IFunction {
  list: string[];
  option: boolean;
}

const mainFunc: IObject = Object.assign(
  (): IFunction => {
    const context = {
      list: [],
      option: true,
    };

    return new Proxy(context, handler);
  },
  {
    addAMethod(name: string, fn: (...args: any[]) => any) {
      Object.assign(core, fn);
    },
  },
);

const handler = {
  get(context: {[key: string]: any}, prop: string, receiver: IFunction) {
    if (prop in context) {
      return context[prop];
    }
    if (prop in core) {
      return core[prop];
    }
  },
};

const core = {
  evaluate: (val: any) => true,
  doSomething: (val: any) => false
}

export default mainFunc;

现在,这将允许以下操作之一:

import mainFunc from "./mainFunc"

mainFunc().evaluate('wow'); // Should return true

这当然不会返回true,而是表明evaluate()不是类型IFunction的一部分,这是正确的。但是,当我尝试添加它时,又遇到了另一个错误,我无法将函数分配给IFunction,因为它没有定义evaluate()

// ...

interface IFunction {
  list: string[];
  option: boolean;
  evaluate(val: any): boolean;
}

const mainFunc: IObject = Object.assign(
  (): IFunction => {
    const context = {
      list: [],
      option: true,
    };

    return new Proxy(context, handler); // Error happens here
  },
  // ...
);

// ...

const core = {
  evaluate: (val: any) => true,
  doSomething: (val: any) => false
}
  

输入'{list:never [];选项:布尔值; }”不可分配给“ IFunction”类型。     类型'{list:never [];中缺少属性'evaluate';选项:布尔值; }'。

您知道如何键入evaluate()吗?

1 个答案:

答案 0 :(得分:2)

问题是data.append("model", { "TenantId": this.state.TenantId, "TenantUrl": this.state.TenantUrl, "TenantPassword": this.state.TenantPassword }); 构造函数assumes that the proxy will be the same type as the target parameter的TypeScript类型,即使并非总是如此。有open issue要求社区提供帮助,以提供更好的输入方式。

在没有这种情况的情况下,我认为解决此问题的唯一方法将是明智地使用类型断言和data.append("model", JSON.stringify({ "TenantId": this.state.TenantId, "TenantUrl": this.state.TenantUrl, "TenantPassword": this.state.TenantPassword })); 类型。例如,您可以将出现错误的行更改为:

    private SizeF _autoScaleFactor;
    private Size _originalClientSize;

    protected override void SetClientSizeCore(int x, int y)
    {
        base.SetClientSizeCore(x, y);

        _autoScaleFactor = AutoScaleFactor;
        _originalClientSize = new Size(x, y);
    }

    protected override void OnHandleCreated(EventArgs e)
    {
        AutoScaleClientSize();

        base.OnHandleCreated(e);
    }

    private void AutoScaleClientSize()
    {
        var dx = _autoScaleFactor.Width;
        if (!dx.Equals(1.0F))
        {
            _originalClientSize.Width = (int)Math.Round(_originalClientSize.Width * dx);
        }

        var dy = _autoScaleFactor.Height;
        if (!dy.Equals(1.0F))
        {
            _originalClientSize.Height = (int)Math.Round(_originalClientSize.Height * dy);
        }

        ClientSize = _originalClientSize;
    }

,这可能会使错误消失。它不是完全类型安全的,但是只要您确定自己在做什么,就可以了。而且,您也应该能够将该Proxy方法添加到any界面中。

希望有所帮助;祝你好运!

相关问题