export interface IOptionsPropsExtra extends IOptionsProps<IOptionListBelowProps> { delete: any}
export const SelectedChoiceItem: (optionProps: IOptionsPropsExtra<IOptionListBelowProps>) => React.ReactElement<any> =
(optionProps: IOptionsPropsExtra<IOptionListBelowProps>) => {
return (
<Label className={styles.item}>
{optionProps.item.name}
<IconButton iconProps={{ iconName: 'Trash' }} onClick={optionProps.delete} />
</Label>
);
};
我编写了接口(interface) IOptionsPropsExtra 以便能够传递一个额外的参数,该参数称为 delete 并且是一个函数,但这样做我得到:
类型“IOptionsPropsExtra”不是通用的。
我对接口(interface)以及如何扩展它们有误解吗?我认为扩展是基本继承,它允许您继承接口(interface)的所有属性,以便您可以在其之上添加任何新属性,这实际上就是我所做的一切。为什么我收到关于它不是通用的错误?它甚至应该是泛型类型吗?显然不应该给出我正在尝试做的事情,而且不是任何通用的东西,这与我在这里尝试做的事情背道而驰?
最佳答案
需要明确的是,“通用”类型是使用另一种类型作为变量的类型。IOptionsPropsExtra
不是泛型类型,因为它可以在不提供任何其他类型的情况下完全解析。
let IOptionsPropsExtra | null = null // works fine.
IOptionsProps
是泛型类型,因为它需要将另一种类型传递给它。当您说 IOptionsProps<IOptionListBelowProps>
时,您正在这样做.所以你正在锁定你的
IOptionsPropsExtra
类型为 IOptionsProps
泛型参数类型为 IOptionListBelowProps
.我认为你的意图是两件事之一。
IOptionsPropsExtra
始终延长 IOptionsProps<IOptionListBelowProps>
并且任何其他类型都不应该传递给 IOptionsProps
当您使用自定义类型时。如果这是您想要的,那么您已经正确声明了该类型,您只需像使用任何其他类型一样使用它,而无需 <ParameterType>
句法。 (optionProps: IOptionsPropsExtra) => {
IOptionsPropsExtra
是通用的,就像它扩展的类型一样。在这种情况下,您需要将其声明为泛型,并将泛型参数转发到它扩展的类型:export interface IOptionsPropsExtra<T> extends IOptionsProps<T> {
delete: any
}
并像这样使用它:
(optionProps: IOptionsPropsExtra<IOptionListBelowProps>) => {
关于typescript - 从接口(interface)扩展以添加新属性会导致 "Type X is not generic",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60730952/