我有这两个接口:
export interface IProductInCartBody {
count: number;
variantId: string;
}
export interface IProductInCart {
id: string;
variantId: string;
name: string;
price: number;
count: number;
}
字符串
为什么这一行没有错误?
const test: IProductInCartBody[] = productsInTheCart as IProductInCart[];
型
我想我已经试过了)
2条答案
按热度按时间xjreopfe1#
你不会在那一行得到错误,因为TypeScript允许你在某些情况下执行类型Assert,即使类型不完全相同。
在这种特定情况下,类型Assert
productsInTheCart
asIProductInCart[]
告诉TypeScript将productsInTheCart
变量视为IProductInCart
对象的数组,即使其声明的类型是IProductInCartBody[]
。TypeScript允许这种类型Assert,因为
IProductInCartBody
具有IProductInCart
属性的子集,即count和variantId。当您将
IProductInCartBody
数组分配给IProductInCart[]
类型的变量时,TypeScript会推断数组中的每个元素至少具有IProductInCart
所需的属性。其他属性,如
id
,name
和price
,对于TypeScript验证赋值是不必要的。jgwigjjp2#
因为
IProductInCartBody
定义了一个满足接口契约的对象必须有一个类型为number
的属性count
和一个类型为string
的属性variantId
。由于
IProductInCart
类型的ab对象满足了这两点,它满足了这个契约(=接口),因此您可以分配值。换句话说,
IProductInCart
比IProductInCartBody
更具体。你也可以定义你的接口如下,这样更容易理解:字符串
另请参阅TypeScript docs on type compatibility。