在打字稿中,我应该有一个单独的类型来表示从数据库返回的记录和为记录创建提交的数据吗?

In Typescript should I have a separate type for representing a returned record from the DB and the submitted data for record creation?

在 Typescript 概念上苦苦挣扎。在我的应用程序中,用户可以为可供销售的产品创建出价或价格,但在进行输入时,我一直在使参数可选之间来回切换,以便我可以传入部分创建的模型以进行保存并填充数据,如 id , created_date, 等并且只对 return 类型使用相同的模型。

为最终相同的模型创建多个接口感觉是多余的,但根据我的阅读,我只是认为这是错误的,应该分别查看表单数据和创建的模型。只是想知道这是否是一直使用 Typescript 的人们所接受的做法?

interface Price {
  id?:number;
  amount: number;
  product: Product | number;
  created_on?: string; 
}

interface PriceFormData {
  amount: number;
  product: number;
}

interface Price {
  id: number;
  amount: number;
  product: Product;
  created_on: string;
}

没有 one-size-fits-all 答案。这取决于你如何使用你的类型,如果没有这样的例子,只能给出 hypothetical/academic 建议。

在您提供的这种情况下,一般来说,最好定义多个代表每种可能性的特定类型,然后将它们联合起来,这样您就可以 discriminate them 当您不确定是哪种类型时你会得到。当您确定您会遇到哪种类型时,这也为您提供了更强大的类型,因此在访问属性等时不必执行那么多检查

类型的组合也很强大。考虑以下示例:

TS Playground

type Product = unknown;

type Amount = { amount: number };

type PriceFormData = Amount & { product: number };

type Price = Amount & {
  created_on: string;
  id: number;
  product: Product;
};

type PriceOrFormData = Price | PriceFormData;

function findProduct (productId: number): Product {
  // ...lookup in DB
  return /* product from DB */;
}

function getProductFromPriceInfo (priceInfo: PriceOrFormData): Product {
  if ('id' in priceInfo) {
    priceInfo; // priceInfo is type Price
    return priceInfo.product;
  }
  else {
    priceInfo; // priceInfo is type PriceFormData
    return findProduct(priceInfo.product);
  }
}

Here's a another example of composition using generics.