我有这个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);
所有东西都可以与它相连。
答案 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
的常量。 ObjectConstructor
是defined 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)
因为您要告诉打字稿“必须定义这些属性”,即不输入“?”在界面键上,但是没有定义它们之间的矛盾。
您不能拥有所需的所有键。 但是然后不要实现它们。
希望这可以让我知道是否需要更多信息。