【问题标题】:Avoid two time argument definition when passing function as argument typescript将函数作为参数打字稿传递时避免两次参数定义
【发布时间】:2020-08-10 05:09:32
【问题描述】:

据我研究,如果你想将一个函数作为参数传递并用作回调,你需要在方法中引入回调函数将要使用的所有参数,然后再一次那些相同的参数,当你在参数中定义回调函数的类型时,所以两次。

在我下面的代码示例中,两个星号之间的参数必须定义两次,因为大多数参数是针对回调函数的,在定义回调本身时必须再次定义回调函数的类型(参见最后一个参数回调函数):

keyBoardListenerSet: (**gl:WebGLRenderingContext**, 
    document:Document, **primitiveType: GLenum**,
    **offset: number**, **count: number**, **program:WebGLProgram**,
    pos: Float32Array, rot: Float32Array, anglesChanged: {x:boolean, y:boolean, z:boolean},
    callbackFunc: (gl:WebGLRenderingContext, primitiveType: GLenum, offset: number,
    count: number, program: WebGLProgram) => void): void => {
    

    //really meaningful code


}

我试图通过已在变量中设置的参数来传递函数,并在我的函数中延迟执行以避免参数类型定义,但我认为这是不可能的(我是 Javascript 新手),所以如果这个是不可能的,有没有更简洁的方法在打字稿中使用回调函数作为参数(我的意思是,一种避免为回调函数中使用的同一参数设置两次类型的方法)?谢谢

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    您可以将类型重构为它自己的类型声明,然后您还可以将可重用的参数分组为单个参数作为对象:

    例如

    
    // could also be a Tuple if you don't want to type out param keys e.g. type A = [number, string]
    type KeyboardListenerParam = {
        gl: WebGLRenderingContext,
        primitiveType: GLenum,
        offset: number,
        count: number,
        program: WebGLProgram,
        pos: Float32Array,
        rot: Float32Array,
        document: Document,
        anglesChanged: { x: boolean, y: boolean, z: boolean }
    };
    
    const something = {
        keyBoardListenerSet: (
            params: KeyboardListenerParam,
            callbackFunc: (params: KeyboardListenerParam) => void
        ): void => {
            window.requestAnimationFrame(() => {
                callbackFunc(params);
            });
            //really meaningful code
        }
    }
    

    【讨论】:

    • 非常感谢,这正是我想要的。但是,当我尝试直接设置程序 userInput.keyBoardListenerSet({ gl, primitiveType, offset, count, shader.program, pos, rot,anglesChanged, document }, draw); 时出现了一个新问题。我在 shader.program 中遇到错误:对象文字只能指定已知属性,并且类型“KeyboardListenerParam”.ts(2345) 中不存在“shader”。我不能在作为参数传递的对象上直接插入另一个类属性作为参数吗? (shader 是一个以程序为属性的分离类,const shader: Shader = new Shader(....))。谢谢
    • hmm,除非您使用来自 lodash 的 e.g. _.pick,否则没有一个很好的方法可以避免显式复制/传递参数,我可能只是传递一个新对象并再次访问来自 params 的键.
    • 您可以传递所有对象并访问特定参数,还可以在调用中指定参数的名称,这样就可以完成工作。比如keyBoardListenerSet({ gl, primitiveType, offset, count, program: shader.program }, pos, rot, anglesChanged, document, draw);见“程序:shader.program”
    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-06-17
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多