Как использовать @template с неструктурированными аргументами в JSDoc / Typescript - PullRequest
0 голосов
/ 27 ноября 2018

в машинописном тексте я могу сделать что-то вроде этого:

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 на самом деле не являются общими

...