gpt4 book ai didi

typescript - 错误 TS2322 : Type '{ id: string; }' is not assignable to type 'ApiModelFilter'

转载 作者:搜寻专家 更新时间:2023-10-30 20:57:10 24 4
gpt4 key购买 nike

我尝试定义一些过滤器,其中过滤器对象的键应该是从模型接口(interface)扩展的任何接口(interface)的键。

模型接口(interface)只定义了一个 id 属性。

当我尝试通过定义 id 和字符串作为值来在通用类中使用 ApiModelFilter 类型时,我从标题中得到了错误。

有什么办法可以解决这个问题吗?

我在使用 Typescript v2.8.3 和 v2.6.2 时遇到此错误

interface Model {
id: number;
}

export type ApiModelFilter<M extends Model> = {
[P in keyof M]?: string
};

interface SomeModel extends Model {
name: string;
age: number;
address: string;
}

class GenericModelHandlerClass<M extends Model> {
get_instance(id: number): void {
const the_filter: ApiModelFilter<M> = {
id: 'test'
};
...
}
}

class SomeModelHandlerClass extends GenericModelHandlerClass<SomeModel> {
...
}

最佳答案

嗯,看起来像是一个 TypeScript 错误(或者至少是一个设计限制)。与Microsoft/TypeScript#13442有关其中有人对 Partial<U> 类型的对象字面量感到惊讶没有额外的属性不能分配给 Partial<T>其中 T extends U .现在在那种情况下,它不是错误:T[K]可能比 U[K] 窄对于一些 K , 所以你不能分配 Partial<U>Partial<T> .问题不在于 key ;这是值(value)观。

但是,在您的情况下,您并不关心像 T[K] 这样的值类型或 U[K] .您只关心。它确实看起来像是 {[K in keyof U]?: string} 类型的字面值没有额外的属性应该可以分配给 {[K in keyof T]?: string} 类型的变量如果T extends U . keyof U不能包含 keyof T 中不存在的任何值,所以它应该工作。 (在您的代码中,M 的行为类似于 T,而 Model 的行为类似于 U。)出于某种原因,编译器无法验证这一点。您可能想要提交 issue in GitHub如果您认为这个用例很有说服力。


所以,变通办法。一种方法是进行类型断言:

const the_filter = {
id: 'test'
} as ApiModelFilter<M>; // works

你是说你比编译器更了解,在这种情况下似乎是正确的。

或者您可以像这样重新安排您的代码:

const the_filter: ApiModelFilter<M> = {};
the_filter.id = 'test'; // also works

在这里,您最初将一个空对象分配给 the_filter然后添加 id它的属性(property)。编译器确实识别the_filter有一个可选的 id属性,所以它允许你设置它。


希望其中一个适合您。祝你好运!

关于typescript - 错误 TS2322 : Type '{ id: string; }' is not assignable to type 'ApiModelFilter<M>' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50124552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com