我有一个返回代理的函数,该代理使用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()
吗?
答案 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
界面中。
希望有所帮助;祝你好运!