如何在TypeScript中正确使用extends实例?

如何在TypeScript中正确使用extends实例?,typescript,types,interface,assertion,union-types,Typescript,Types,Interface,Assertion,Union Types,我使用打字脚本,但仍然有很多混乱 我创建了这样一个实例: 接口产品{ 键入:“免费”|“付费”; 价格?:数字; } 我之所以将price设置为可选属性,是因为我只想在类型为“pay”时将其设置为有效属性 因此,我想创建如下界面: 接口产品{ 键入:“免费”|“付费”; } 接口PayProduct扩展了产品{ 类型:“支付”; 价格:数量; } 我想这样使用它 const loggingPrice=(产品:产品)=>{ if(product.type!==“pay”)返回; //产品绝对是

我使用打字脚本,但仍然有很多混乱

我创建了这样一个实例:

接口产品{
键入:“免费”|“付费”;
价格?:数字;
}
我之所以将price设置为可选属性,是因为我只想在类型为“pay”时将其设置为有效属性

因此,我想创建如下界面:

接口产品{
键入:“免费”|“付费”;
}
接口PayProduct扩展了产品{
类型:“支付”;
价格:数量;
}
我想这样使用它

const loggingPrice=(产品:产品)=>{
if(product.type!==“pay”)返回;
//产品绝对是付费产品。
const{price}=产品;
控制台日志(价格);
}
但是,当然,它会返回如下错误:
TS2339:类型“产品”上不存在属性“价格”。

这就是我使用类型断言的原因

接口产品{
键入:“免费”|“付费”;
}
接口PayProduct扩展了产品{
类型:“支付”;
价格:数量;
}
const loggingPrice=(产品:产品)=>{
if(product.type!==“pay”)返回;
//产品绝对是付费产品。
const{price}=作为PayProduct的产品;
控制台日志(价格);
}
我想不出别的办法了

我认为这是一种糟糕的方式。 我真的不喜欢类型断言。(我觉得我在对跳棋者撒谎。)

使用这些已定义接口的最佳方式是什么

我为我糟糕的英语技能道歉。(我依靠自动翻译。)
但是我很好奇是否有一种方法可以正确使用这些接口。

不要扩展。而是创建两种类型的有区别的并集。现在它是一个或另一个(不可能只是一个基本接口实例)。测试
product.type!='pay'
将正确缩小范围


欢迎来到SO。“我为我糟糕的英语技能道歉”。。。不要。这是一个问得很好的问题您共享了文档,因此我可以信任此方法。非常感谢你。
interface PayProduct {
  type: 'pay';
  price: number;
}

interface FreeProduct {
  type: 'free';
}

type Product = PayProduct | FreeProduct;

const loggingPrice = (product: Product) => {
  if (product.type !== 'pay') return;
  // product is definitely PayProduct.
  const { price } = product;
  console.log(price);
}