Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将函数作为参数typescript传递时,避免使用两次参数定义_Typescript_Typescript Typings - Fatal编程技术网

在将函数作为参数typescript传递时,避免使用两次参数定义

在将函数作为参数typescript传递时,避免使用两次参数定义,typescript,typescript-typings,Typescript,Typescript Typings,据我所研究,如果希望函数作为参数传递并用作回调函数,则需要在方法中引入回调函数将要使用的所有参数,然后在参数中定义回调函数的类型时,再次引入这些参数,因此需要两次 在下面的代码示例中,两个星号之间的参数必须定义两次,因为大多数参数都用于回调函数,在定义回调函数本身时,必须再次定义回调函数的类型(请参见最后一个参数callbackFunc): 我试图用变量中已经设置的参数传递函数,并延迟函数中的执行以避免参数类型定义,但我认为这是不可能的(我是Javascript新手),因此如果这不可能,有没有更

据我所研究,如果希望函数作为参数传递并用作回调函数,则需要在方法中引入回调函数将要使用的所有参数,然后在参数中定义回调函数的类型时,再次引入这些参数,因此需要两次

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


我试图用变量中已经设置的参数传递函数,并延迟函数中的执行以避免参数类型定义,但我认为这是不可能的(我是Javascript新手),因此如果这不可能,有没有更详细的方法在typescript中使用回调函数作为参数(我的意思是,一种避免为回调函数中使用的同一参数设置两次类型的方法)?感谢您可以将类型重构为其自己的类型声明,然后您还可以将可重用参数分组为单个参数作为对象:

e、 g


非常感谢,这正是我所寻找的。但是,当我试图直接设置程序userInput.keyBoardListenerSet({gl,primitiveType,offset,count,shader.program,pos,rot,anglesChanged,document},draw)时,出现了一个新问题;我在shader.program中遇到错误:Object literal可能只指定已知属性,而“KeyboardListenerParam”类型中不存在“shader”。ts(2345)。我是否可以在作为参数传递的对象上直接插入另一个class属性作为参数?(shader与作为属性的程序分离,常量shader:shader=new shader(…)).Thankshmm,没有什么好方法可以避免显式复制/传递参数,除非您使用
例如,从lodash中拾取
,否则我可能只会传递一个新对象,然后再次从
params
访问键。您可以传递所有对象和访问特定参数,但也可以指定参数的名称例如
keyBoardListenerSet({gl,primitiveType,offset,count,program:shader.program},pos,rot,anglesChanged,document,draw);
参见“program:shader.program”
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


}

// 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
    }
}