Настоящая проблема здесь связана с функцией useDictation
. По умолчанию даже в машинописном тексте функция, возвращающая массив, является массивом, а не типом кортежа.
const toggleDictation = async () => { }
const useDictation = () => { // returns Array<(() => Promise<void>) | never[]>
return [toggleDictation, []]
}
const [tg, arr] = useDictation(); // tg is (() => Promise<void>) | never[] so uncallable
Playground Link
В ts вы можете добавить as const
или явную аннотацию типа, чтобы исправить это:
const toggleDictation = async () => { }
const useDictation = () => { // returns Array<(() => Promise<void>) | never[]>
return [toggleDictation, []] as const
}
const [tg, arr] = useDictation(); // tg is now () => Promise<void>
tg() // ok
Playground Link
Для 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
Playground Link
Или вы можете добавить файл декларации, но это действительно зависит от ваших настроек. Если вы создадите объявление для модуля, вы больше не получите вывод от js. Вы можете сгенерировать d.ts
из файлов js (доступно с версии 3.7 PR ) и исправить любые объявления (например, тип возврата useDictation
)
declare const useDictation : () => [()=> Promise<void>, string[]]
let [tg, d] = useDictation(); // tg is ()=> Promise<void>
tg() // ok
Детская площадка Link