в машинописном тексте я могу сделать что-то вроде этого:
const foo = <T>({ someArg }: { someArg: T }) => someArg
foo({ someArg: 4 }) // returns a number
foo({ someArg: "cool" }) // returns a string
как мне сделать эквивалент с jsdoc / checkjs?я предположил, что это будет выглядеть так:
/**
* @template T
*
* @param {object} props
* @param {T} props.someArg
* @returns {T}
*/
const foo = ({ someArg }) => someArg
foo({ someArg: 4 })
foo({ someArg: 'cool' })
, но я получаю ошибку, которая выглядит следующим образом:
src/components/example.js:10:7 - error TS2322: Type 'number' is not assignable to type 'T'.
10 foo({ someArg: 4 })
~~~~~~~
src/components/example.js:5:4
5 * @param {T} props.someArg
~~~~~~~~~~~~~~~~~~~~~~~~
6 * @returns {T}
~~~
The expected type comes from property 'someArg' which is declared here on type '{ someArg: T; }'
src/components/example.js:11:7 - error TS2322: Type 'string' is not assignable to type 'T'.
11 foo({ someArg: 'cool' })
~~~~~~~
src/components/example.js:5:4
5 * @param {T} props.someArg
~~~~~~~~~~~~~~~~~~~~~~~~
6 * @returns {T}
~~~
The expected type comes from property 'someArg' which is declared here on type '{ someArg: T; }'
~~~~~~~
не деструктурирование аргументов, кажется, работает хорошо:
/**
* @template T
*
* @param {object} props
* @param {T} props.someArg
* @returns {T}
*/
const foo = props => props.someArg
обновление - я думаю, что это, вероятно, эта проблема: Универсальные типы из JSDoc на самом деле не являются общими