为什么不能给钩子的初始值赋予空对象?

时间:2019-06-09 23:31:03

标签: reactjs typescript

我有这个setProd挂钩

export interface faceProduct {
  readonly title: string;
  readonly prodState: string;
  readonly shipping: string;
  readonly sold: string;
  readonly alt: string;
  readonly material: string;
  readonly location: string;
  readonly src: string[];
  readonly color: string[];
  readonly saiz: string[];
  readonly price: string;
}

export interface faceProductList extends faceProduct {
  readonly id: string;
  readonly to: string;
}

 const [prod, setProd] = useState<faceProductList>({});

我希望初始值是一个空对象。但是出现错误。

 const [prod, setProd] = useState<faceProductList>(Object);

所有东西都可以与它相连。

2 个答案:

答案 0 :(得分:4)

第一种情况

const [prod, setProd] = useState<faceProductList>({});

正确产生错误。正如@Shanon Jackson所提到的,faceProductList类型具有非可选属性,因此{}无法分配给类型faceProductList的变量。

如果要分配,请使Partial<>类型的所有faceProductList道具成为可选。

const [prod, setProd] = useState<Partial<faceProductList>>({});

第二种情况是哄骗TS编译器的一种方式

const [prod, setProd] = useState<faceProductList>(Object);

让我们看看Object is是什么。

declare const Object: ObjectConstructor;

它是类型ObjectConstructor的常量。 ObjectConstructordefined as

interface ObjectConstructor {
    new(value?: any): Object;
    (): any;
    (value: any): any;
    // ... other members
}

记下函数签名(): any;。因此Object可以是类型为any的函数返回变量。

现在让我们看看useState definition

function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];

initialState可以是S类型,也可以是返回S的函数。由于Object也可以用作函数,但是返回更通用的类型any,因此可以在调用useState时用作参数。

呼叫Object()将返回new empty object。由于呼叫签名为() => any,因此告诉TS不要检查类型。是的,因此您将获得初始空对象,但无需类型检查

答案 1 :(得分:1)

因为您要告诉打字稿“必须定义这些属性”,即不输入“?”在界面键上,但是没有定义它们之间的矛盾。

您不能拥有所需的所有键。 但是然后不要实现它们。

希望这可以让我知道是否需要更多信息。