如何正确记录此通用功能?

时间:2020-03-27 14:52:48

标签: typescript jsdoc

/**
 * Wraps a styled component to supply default props
 * @template {T} - Component type
 * @template {TDefaults} - Default props
 * @param {T} component  - Our styled component object
 * @param {TDefaults} defaultProps - The object's default props
 * @returns the styled component with default props applied
 */
export function withDefault<T extends { defaultProps?: Partial<TDefaults> }, TDefaults>(component: T, defaultProps: TDefaults): T & { defaultProps: TDefaults } {
  // eslint-disable-next-line no-param-reassign
  component.defaultProps = defaultProps;
  // Cast to any necessary as we can't infer styled component type
  return component as any;
}

这将返回以下错误:

  5:0    warning  The type 'T' is undefined          jsdoc/no-undefined-types
  6:0    warning  The type 'TDefaults' is undefined  jsdoc/no-undefined-types
  9:41   warning  Missing JSDoc comment              jsdoc/require-jsdoc
  9:135  warning  Missing JSDoc comment              jsdoc/require-jsdoc

1 个答案:

答案 0 :(得分:0)

对于JSDoc @template,大括号{...}中的内容是 constraint ,并且模板变量名称应放在大括号之后。因此correct syntax应该是:

/**
 * Wraps a styled component to supply default props
 * @template {{ defaultProps?: Partial<TDefaults> }} T - Component type
 * @template {any} TDefaults - Default props
 * @param {T} component  - Our styled component object
 * @param {TDefaults} defaultProps - The object's default props
 * @returns the styled component with default props applied
 */
export function withDefault<T extends { defaultProps?: Partial<TDefaults> }, TDefaults>(component: T, defaultProps: TDefaults): T & { defaultProps: TDefaults } {
  // eslint-disable-next-line no-param-reassign
  component.defaultProps = defaultProps;
  // Cast to any necessary as we can't infer styled component type
  return component as any;
}

您还需要根据this doc将eslint选项settings.jsdoc.mode设置为typescript,以抑制该错误。