Typescript 等效类型,但在使用可选索引签名时不可分配:为什么?
我有以下情况:Typescript 等效类型,但在使用可选索引签名时不可分配:为什么?,typescript,Typescript,我有以下情况: type FilterQuery={[P in keyof T]?:T[P]}&RootQuerySelector; 类型RootQuerySelector={ $and?:数组; } 甲级{ 查询:数组 构造函数(){ this.querys=[] } 东西{ 常量查询:FilterQuery={$and:this.querys} console.log(查询) } } stuff()中的query赋值被TS标记为错误: const query: FilterQuery<
type FilterQuery={[P in keyof T]?:T[P]}&RootQuerySelector;
类型RootQuerySelector={
$and?:数组;
}
甲级{
查询:数组
构造函数(){
this.querys=[]
}
东西{
常量查询:FilterQuery={$and:this.querys}
console.log(查询)
}
}
stuff()
中的query
赋值被TS标记为错误:
const query: FilterQuery<T>
Type '{ $and: FilterQuery<T>[]; }' is not assignable to type 'FilterQuery<T>'.
Type '{ $and: FilterQuery<T>[]; }' is not assignable to type '{ [P in keyof T]?: T[P] | undefined; }'.(2322)
常量查询:FilterQuery
类型“{$and:FilterQuery[];}”不能分配给类型“FilterQuery”。
类型“{$and:FilterQuery[];}”不可分配给类型“{[P in keyof T]?:T[P]| undefined;}”。(2322)
我希望{$and:this.querys}
是一个有效的FilterQuery
,因为它是RootQuerySelector
允许的形状(顺便说一句,这些类型来自MongoDB官方节点驱动程序)
为什么这里会有问题?我该如何解决?谢谢。这很可能是一个bug。编译器在计算对象时遇到问题,因为还没有类型信息。他不知道
{[P in keyof t]?:t[P]}
在为t
设置实类型之前解析为什么。如果你把{[P in keyof T]?:T[P]}
拿走,他不会抱怨的。但是您可以欺骗编译器():
A类{
查询:数组
构造函数(){
this.querys=[]
}
东西{
常量查询:FilterQuery={};
query.$and=this.querys;
console.log(查询)
}
}
我以前撞过。有了这些知识,您可以将两个值无误地输入到结果对象中。除非我弄错了,{[P in keyof T]?:T[P]}
是部分的
对吗?是的,的确如此。还有传播工作,谢谢
class A<T> {
queries: Array<FilterQuery<T>>
constructor() {
this.queries = []
}
stuff() {
const query: FilterQuery<T> = {};
query.$and = this.queries;
console.log(query)
}
}