如何在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);
}