在编译时可能不存在的Typescript调用函数

时间:2015-11-20 23:07:24

标签: typescript

我正在尝试编写一个检查回调函数的库,然后在它准备好时调用它。这个想法是你可以异步地包含JS,然后当它被加载时它会检查回调并执行它。

我正在使用打字稿。以下JS工作但不会在TS中编译

if(typeof myFramework.ready === 'function') {
    myFramework.ready();
}

然后使用该库的开发人员可以执行以下操作:

var myFramework = myFramework || {}; // As the framework wont exists
myFramework.ready = function(){//Execute developer's code};

但是,使用TypeScript我会收到类型错误:Property' ready'在myFramework'的类型'类型中不存在 - 这并不奇怪。如果我执行以下操作,它会编译:

interface Window {
    ready(): void;
}

if(typeof window.ready === 'function') {
    window.ready();
}

但这意味着要向窗口对象添加更多内容。我想,调用一个全局的ready()方法很可能是一个失败点!

你将如何实现这一目标?

感谢@ james-crosswell - 因为我在单独的文件中有类,所以具有Ajax处理位的文件看起来像:

module MyFramework {
    export interface IMyFramework {
        ready? : () => any;
    }

    export class HasLoaded implements IMyFramework {
        doReady = (framework: IMyFramework) => {
            if(typeof framework.ready === 'function') {
                framework.ready();
            }
        }
    }

    var newHost: HasLoaded = new HasLoaded();
    newHost.doReady(MyFramework);
}

我可能正在重新考虑让我来到这里的逻辑,但这是一个单独的问题!

3 个答案:

答案 0 :(得分:0)

为什么不在框架上定义用户在加载时调用的函数?像init(callback_to_developer_code);

这样的东西

但是如果你坚持按照自己的方式去做,你只需在框架类接口上定义一个可选属性,如下所示:

interface IMyFramework {
  ready? : Function;
}

class MyFramework implements IMyFramework {
}

var myFramework : MyFramework;

if(typeof myFramework.ready !== 'undefined') {
    myFramework.ready();
}

答案 1 :(得分:0)

你当然可以在Typescript中的模块中声明/导出接口......但它们不会对你的框架用户有任何用处,除非那些用户也在使用Typescript(并且你的框架有tsd)。 / p>

有了这个警告,上面@gilamran的答案的以下变体在Typescript Playground上工作:

module MyModule {
    export interface IMyFramework {
        ready? : () => any;
    }

    class MyFramework implements IMyFramework {
    }

    class YourFramework implements IMyFramework {
        ready = () => {
            alert("You're ready");
        }
    }

    export class Host {
        doReady = (framework: IMyFramework) => {
            if(typeof framework.ready !== 'undefined') {
                framework.ready();
            }           
        }
    }

    var host: Host = new Host();
    host.doReady(new MyFramework());
    host.doReady(new YourFramework());

}

答案 2 :(得分:0)

我是TypeScript的新手,所以请随意忽略我,但我个人更喜欢检查类型是否是一个函数,因为它更明确和安全(至少在vanilla JS中)。猜测这是我不知道的TypeScript的一部分,但是在定义时可以有很多引用。

if (typeof method === 'function') {
    method();
}

或者你可能会逃脱:

method && method();