为什么我不能仅在属性lastById
下定义pairsByIntOrderId
?
TransactionsByIdState类型是否不具有属性pairsByIntOrderId
,并且可以有选择地具有映射到Transaction的字符串类型的其他属性?
interface Transaction {
amount: number,
id: string
}
interface PairTransactionsById {
[id: string]: {
amount1: number,
amount2: number,
}
}
export type TransactionsByIdState = {
[id: string]: Transaction;
} & { pairsByIntOrderId: PairTransactionsById };
const lastById: TransactionsByIdState = { pairsByIntOrderId: {} };
答案 0 :(得分:1)
为什么我不能仅在属性对PairsByIntOrderId下定义lastById?
因为索引签名会强制执行所有 属性match its return type。
使用类型TransactionsByIdState
基本上是说所有字符串属性都必须具有Transaction
类型。此条件适用于财产
pairsByIntOrderId
也是如此,它是通过交叉点添加的。
pairsByIntOrderId
也被声明为PairTransactionsById
类型。由于PairTransactionsById
无法分配给Transaction
,因此您已经在此处创建了一个“永不满足”类型。唯一防止编译器发出错误的是,交集永远不会产生错误(比较here和here)。
话虽如此,具体的解决方案取决于您的用例和类型要求。您可以签出并订阅此feature request以获取具有索引签名+属性的混合类型。如果Transaction
和PairTransactionsById
不兼容(在这里似乎是这种情况),则应将它们独立存储。同样,separating index signature from explicit properties通常是很好的打字经验法则。
答案 1 :(得分:0)
您不能为pairsByIntOrderId
分配空对象,因为它的类型需要两个字段-amount
和id
。 TypeScript需要它们,因为它们不是可选的。有两种解决方法:
您可以将两个字段都设为可选;
interface Transaction {
amount?: number;
id?: string;
}
或使用Partial
类型,它会在每个字段可选的情况下构造一个新类型;
[id: string]: Partial<Transaction>;