Javascript 如何键入在JS中创建并在TSX文件中使用的自定义React钩子?

Javascript 如何键入在JS中创建并在TSX文件中使用的自定义React钩子?,javascript,reactjs,typescript,react-hooks,Javascript,Reactjs,Typescript,React Hooks,不幸的是,我有一个自定义的钩子,它是用纯JS编写的,我在TypeScript.tsx文件中使用它 我把它叫做 常量[切换听写,听写结果]=使用听写 useEffect=>{ //开始识别 切换听写; }, []; 我在编译器中得到一个错误,它说: This expression is not callable. Not all constituents of type 'string | boolean | never[] | (() => Promise<void>)'

不幸的是,我有一个自定义的钩子,它是用纯JS编写的,我在TypeScript.tsx文件中使用它

我把它叫做

常量[切换听写,听写结果]=使用听写 useEffect=>{ //开始识别 切换听写; }, []; 我在编译器中得到一个错误,它说:

This expression is not callable.
  Not all constituents of type 'string | boolean | never[] | (() => Promise<void>)' are callable.
    Type 'string' has no call signatures.ts(2349)


是否有方法进行类型转换或断言以正确设置函数类型以删除错误?

键入此项不会对编译结果产生影响。
当然,如果这在一个普通的JS文件中起作用,我说的是错误的,但问题似乎在于实现,而不是缺少键入

键入此项不应影响编译结果。
当然,如果这在一个普通的JS文件中起作用,我说的是错误的,但问题似乎在于实现,而不是缺少键入

这里真正的问题是useDictation函数。默认情况下,即使在typescript中,返回数组的函数也是数组而不是元组类型

const toggleDictation = async () => { }
const useDictation = () => { // returns Array<(() => Promise<void>) | never[]>
    return [toggleDictation, []]
}

const [tg, arr] = useDictation(); // tg is (() => Promise<void>) | never[] so uncallable
对于JS,我们有一些选项,如果您控制JS,您可以添加jsdoc类型,TS将获取这些类型:

const toggleDictation = async () => { }

/**
 * @returns {[()=> Promise<void>, string[])]}
 */
const useDictation = () => {
    return [toggleDictation, []]
}

let [tg, d] = useDictation(); // tg is ()=> Promise<void>
tg() // ok in ts as well 



这里真正的问题是useDictation函数。默认情况下,即使在typescript中,返回数组的函数也是数组而不是元组类型

const toggleDictation = async () => { }
const useDictation = () => { // returns Array<(() => Promise<void>) | never[]>
    return [toggleDictation, []]
}

const [tg, arr] = useDictation(); // tg is (() => Promise<void>) | never[] so uncallable
对于JS,我们有一些选项,如果您控制JS,您可以添加jsdoc类型,TS将获取这些类型:

const toggleDictation = async () => { }

/**
 * @returns {[()=> Promise<void>, string[])]}
 */
const useDictation = () => {
    return [toggleDictation, []]
}

let [tg, d] = useDictation(); // tg is ()=> Promise<void>
tg() // ok in ts as well