使用带有 Typescript 的草坪椅

Posted

技术标签:

【中文标题】使用带有 Typescript 的草坪椅【英文标题】:Using lawnchair with Typescript 【发布时间】:2013-03-18 18:33:02 【问题描述】:

遇到了一个简单的问题,在使用 typescript 的“this”范围的类似问题中涉及到了这个问题。

我有一项存储服务,可以为我的本地存储问题包裹草坪椅。现在我正在将此代码迁移到 Typescript 我遇到了一个我无法解决的问题。

public GetAll(callback: Function) 
           Lawnchair( name: this.storeName , function () 
                this.all(callback);
            );
        ;

现在在上面的示例中,草坪椅使 this 成为您正在操作的实际商店,但 Typescript 将使其成为您正在使用的类的实例。那么有没有办法解决这个问题呢?

== 编辑 ==

稍微更新了问题示例,以免与底层的草坪椅方法和周围的类方法混淆。

这是我在尝试编译时遇到的错误:

类型的值不存在属性“all” 'LawnchairStorageService'

这是正确的,该方法不存在于包含的类实例中,它存在于草坪关闭范围的上下文中this

【问题讨论】:

这是生成代码的问题(运行时),还是 TypeScript 不理解“this”是什么类型(编译时)?如果是前者,附上生成的代码并说明它有什么问题是有帮助的。如果是后者,则将“this”转换为您所知道的应该这样做。 是后者,打字稿编译器抛出错误,我不认为强制转换 this 会起作用,因为它仍然是底层类实例而不是草坪椅实例.不过,我会用错误更新问题! 这个工作吗:typescriptlang.org/Playground/… @jcfx 是的,可以编译,我还没有让应用程序进入 working 状态,所以我可以测试编译后的打字稿,但它应该在运行时工作,因为它只会包装底层的自执行代码。 好东西。我认为 Ryan 或 Steve 可能会提出一个更优雅的解决方案,但如果这能让你继续前进,那就太好了。让我知道它是否真的运行,如果它运行,我会把它写下来作为答案。 【参考方案1】:

您是否尝试过以下方法:

public Exists(uniqueIdentifier: string, callback: Function) 
           var me = this;
           Lawnchair( name: this.storeName , function (me) 
                me.exists(uniqueIdentifier, callback);
            );
        ;

【讨论】:

这不起作用,因为您的 me 变量将等于包含类的实例,而不是创建的草坪椅实例。因此,您基本上执行的逻辑与问题示例中所示的逻辑完全相同,但方式更为冗长。【参考方案2】:

正如上面的 cmets 所述,它可以编译,我认为它应该可以运行:

public GetAll(callback: Function) 
    return function (callback)
        Lawnchair( name: this.storeName , function () 
            this.all(callback);
        );
    (callback);
;

...但我怀疑其他人可能会提出更优雅的解决方案。

【讨论】:

您可以得到答案,如果确实有更好的解决方案,我会移动答案,但无论哪种方式,您都希望得到一些支持:)

以上是关于使用带有 Typescript 的草坪椅的主要内容,如果未能解决你的问题,请参考以下文章

带有样式组件的 TypeScript

使用带有Typescript的样式化组件,prop不存在?

带有泛型的 Typescript JSX - 参数隐式具有“任何”类型

导入的类不能在带有 TypeScript 的 Angular.js 中用作服务

如何在 Typescript 中正确使用 React.lazy() 来导入带有泛型类型参数的反应组件?

TypeScript 中的“类型”保留字是啥?