我有一个类似于这样的类型记录界面:
interface DataSku {
fields: {
sku: string;
}
}
interface PostProduct {
fields: {
title: string;
skus: DataSku[];
}
}
现在,我想扩展Product
接口,以便skus
数组中的每个对象都有一个额外的字段。所以我试了一下:
interface Sku extends DataSku {
stripe: Stripe.skus.ISku;
}
interface Product extends PostProduct {
fields: PostProduct['fields'] & {
skus: Sku[];
}
}
在我的代码中,我尝试这样的循环:
(product as Product).fields.skus.forEach(sku => console.log(sku.stripe));
这会引发以下类型记录错误:
Property 'stripe' does not exist on type 'DataSku'.
我把接口扩展错了吗?控制台按照预期输出我的条带对象,所以只是类型记录不满意定义。
发布于 2019-09-08 10:11:18
对于这一点,一种更优雅(也更有效)的方法是使用仿制药。
使用用于fields.skus
类型的泛型参数更新fields.skus
interface PostProduct<T extends DataSku = DataSku> {
fields: {
title: string;
skus: T[];
}
}
T extends DataSku
意味着该类型必须是DataSku
的一个子类型。我们甚至可以为T
设置一个默认值,这样也可以使用PostProduct
而不必指定泛型参数。
现在,对于Product
,我们只需将Sku
作为泛型参数传递:
interface Product extends PostProduct<Sku> {}
游乐场
也就是说,如果您想不使用泛型,也不需要修改DataSku
和PostProduct
。你可以这样做:
interface Product extends PostProduct {
fields: Omit<PostProduct['fields'], 'skus'> & {
skus: Sku[];
}
}
游乐场
https://stackoverflow.com/questions/57840944
复制相似问题