为什么我在e4
, e5
, 中出现错误e6
?它们都匹配SomeClass
type 所以它们必须匹配 generic RES
。
class SomeClass {
a: string;
b: number;
c: boolean;
}
class ChildOfSomeClass extends SomeClass {}
const someFunc1 = <RES extends SomeClass>() => {
const e1: SomeClass = { a: "aaa", b: 123, c: true }; // ok
const e2: SomeClass = new SomeClass(); // ok
const e3: SomeClass = new ChildOfSomeClass(); // ok
// Type '{ a: string; b: number; c: true; }' is not assignable to type 'RES'.ts(2322)
const e4: RES = { a: "aaa", b: 123, c: true };
// Type 'SomeClass' is not assignable to type 'RES'.ts(2322)
const e5: RES = new SomeClass();
// Type 'ChildOfSomeClass' is not assignable to type 'RES'.ts(2322)
const e6: RES = new ChildOfSomeClass();
};
我最终想someFunc1
返回,RES | Promise<RES>
但为了这个例子,我简化了它。
RES extends SomeClass
装置,该组由类型描述的值RES
是一个子集的集合由类型描述的值的SomeClass
。想象以下场景:
class MyRES extends SomeClass {
d: string;
}
这满足条件RES extends SomeClass
,但是在您提供的任何构造函数情况下都没有分配d
。
有很多方法可以解决这个问题,而“正确”的解决方案将取决于您想要用这种方法完成什么。例如,一种解决方案是让您的方法采用一些构造函数或转换器方法来RES
从 的已知现有属性创建一个SomeClass
:
const someFunc1 = <RES extends SomeClass>(toRes: (SomeClass) => RES) => {
const e: RES = toRes({ a: "aaa", b: 123, c: true }); // ok
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句