- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试定义一些过滤器,其中过滤器对象的键应该是从模型接口(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/
在嵌入式系统的背景下,给出以下函数结构: 返回变量的条件赋值: int foo(int x) { int status; if (is_valid(x)) {
#input |--IDs-|--Value-| |--da1-|--100---| |--da2-|---80---| |--da3-|--200---| |--da4-|--300---| |--
您可以declare a list of variables and assign them some value在 Perl 6 my ($a, $b) = 33,44 # $a will be 3
在下面的代码中实现对象的浅拷贝,但是不同的输出让我很困惑: 对象.分配: var obj = { name: 'wsscat', age: 0, add: { a: 'beijin
我正在查看一位已不复存在的开发人员的一些旧代码,并注意到有时他使用 Object.assign({}, xyz) 还有他用过的其他东西 Object.assign([], abc); 两者有区别吗?
这个问题在这里已经有了答案: Why were ES5 Object methods not added to Object.prototype? (2 个答案) 关闭 4 个月前。 我正在做一个
我想知道这之间的区别: Object.assign(otherObject, { someNewProperty: '' }); 和 otherObject.someNewProperty = '
考虑以下代码: const defaultState = () => { return { profile: { id: '', displayName: '',
我刚刚偶然发现this line of TS code : const { title = item.text } = item; 这似乎是一个destructuring assigment但是大括号
我是一个没有经验的 JavaScript 用户,正在阅读这本书 CoffeeScript: Accelerated JavaScript Development ,其中作者制作了一种 Scrabble
当我查看日志文件时 D:\SAS\XXX\Lev1\SASMain\BatchServer\Logs 我看到了这两行 NOTE: Libref TESTLIB successfully assigne
我似乎不明白为什么要使用移动赋值运算符: CLASSA & operator=(CLASSA && other); //move assignment operator 结束了,复制赋值运算符: CL
在Eiffel Studio中,我一直试图访问从另一个类定义的一个类的对象的字段。但是,它不断给出我无法理解和解决的错误。以下是示例代码片段: 创建对象的类: class TEST1 feat
为什么这个片段在 Node (10.5) .then(function() { this = {...this, ...payload}; this.update();
我在我的 React 应用程序中使用以下包来生成 Recaptcha 组件:https://github.com/appleboy/react-recaptcha 组件如下所示,带有 eslint 警
我有以下代码: #include #include using std::cout; struct SomeType { SomeType() {} SomeType(const Some
我有这个代码示例: var a = 10; ({a}) = 0; 在 Google Chrome 中,它显示错误:SyntaxError:无效的解构赋值目标 在 Firefox 中,它显示错误:Ref
我有一个函数,用于对两个输入字段的输入求和并将其分配给一个。我的函数如下所示: function sum(id) { nextId = id+2 console.log
我收到这个警告 "Automatic Reference Counting Issue: Assigning retained object to unsafe_unretained variable
在使用 Shopify 的 Liquid 语言编码时,我注意到使用以下语法分配了一些变量: {%- assign variable = value -%} 和使用以下语法分配的其他变量: {% ass
我是一名优秀的程序员,十分优秀!