【问题标题】:DefinitelyTyped: Add new props typing for existing componentDefinitiveTyped:为现有组件添加新的 props 类型
【发布时间】:2017-09-21 04:19:03
【问题描述】:

有没有办法在DefinitelyTyped 中为新的props 声明新类型?我在SelectField 组件中用一些新的props 更新了material-ui,但是DefinitelyTyped 中的输入是旧的。我可以以某种方式扩展SelectField 类型并添加新的props 类型吗?现在我有:

<SelectField
    multiple={true}
    hintText="Select type"
    value={[...this.state.values]}
    onChange={this.onChange}
    selectionRenderer={this.selectionRenderer}
>

我需要添加multiple?: booleanselectionRenderer: (values: any[]) =&gt; string 类型。我尝试declare module 'material-ui/SelectField' {},但它不起作用。有任何想法吗?

【问题讨论】:

    标签: reactjs typescript material-ui typescript-typings definitelytyped


    【解决方案1】:

    你应该可以使用module augmentation:

    declare module "material-ui" {
        interface SelectFieldProps {
            multiple?: boolean;
            selectionRenderer: (values: any[]) => string;
        }
    }
    

    如您所见,语法与您尝试的相比有点不同。


    编辑

    如果SelectFieldProps__MaterialUI 命名空间中定义,那么这应该可以工作:

    declare module "material-ui" {
        namepsace __MaterialUI {
            interface SelectFieldProps {
                multiple?: boolean;
                selectionRenderer: (values: any[]) => string;
            }
        }
    }
    

    【讨论】:

    • 我在typings/SelectFieldProps.d.ts 中添加了这个并且还有error TS2339: Property 'multiple' does not exist on type...
    • 如果您将我的代码粘贴到您尝试使用它的同一文件中会怎样?
    • 不,它仍然不起作用,当然,当我在 node_modules/@types/material-ui/index.s.ts 中添加这个道具时 interface SelectFieldProps 它起作用了,但我没有想出任何方法来扩展现有的打字在其他地方node_modules
    • 检查我修改后的答案
    • 我有像 error TS2694: Namespace '"material-ui".__MaterialUI' has no exported member 'AppBar'. 这样的错误列表以及所有其他组件
    【解决方案2】:

    好的,我找到了解决方案,@Nitzan 回答没关系,但需要一些改进。当我检查node_modules/@types/material-ui/index.d.ts时发现interface SelectFieldProps是在namespace __MaterialUI中定义的,所以我必须这样写:

    declare namespace __MaterialUI {
      interface SelectFieldProps {
        multiple?: boolean;
        selectionRenderer?: (values: any[]) => string;
      }
    }
    

    它在./src/typings/selectfield.d.ts 中有效,如果我在使用&lt;SelectField /&gt; 的同一个文件中声明它就不起作用(可能是因为.d.ts 扩展名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2020-05-17
      • 2010-12-18
      • 2019-05-05
      • 1970-01-01
      • 2021-05-10
      • 2015-11-23
      相关资源
      最近更新 更多