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)
    }
}