编辑: 似乎是由于打字稿3.4中的this change而发生的(感谢@jcalz)。关于如何在启用严格功能类型的情况下支持向上转换的任何想法?
我最近从打字稿3.3.3更新到打字稿3.4.1,以下代码不再起作用:
在打字稿3.4.1之前,我们被允许从Immutable.Record 上载到Immutable.Record ,但是在更新之后,这不再被允许。那是故意的吗?
interface A { a: string }
interface B extends A { b: string }
const RecordA = Immutable.Record<A>({ a: '1' })
const RecordB = Immutable.Record<B>({ a: '1', b: '2' })
let c: Immutable.Record<A> & Readonly<A> = RecordB()
/* You can no longer assign typeof RecordB to RecordA even though it has all the properties of Record A. This used to work before typescript 3.4.1 */
这使得编写这样的共享函数变得更加困难,因为您必须将RecordB的实例显式转换为RecordA才能正确通过类型检查。
function someSharedFunction(arg: Immutable.Record<A>) {
//...
}
还有另一种编写此代码的方法,以便我们可以更轻松地编写共享代码吗?还是我们可以更改输入内容以使这种情况有效?
这是错误消息
Type 'Record<B> & Readonly<B>' is not assignable to type 'Record<A>'.
Types of property 'has' are incompatible.
Type '(key: string) => key is "b" | "a"' is not assignable to type '(key: string) => key is "a"'.
Type predicate 'key is "b" | "a"' is not assignable to 'key is "a"'.
Type '"b" | "a"' is not assignable to type '"a"'.
Type '"b"' is not assignable to type '"a"'.ts(2322)```