不可变。记录打字行为在打字稿3.4.1中已更改。取消上传不再有效

时间:2019-04-08 17:29:40

标签: typescript immutable.js

  

编辑:   似乎是由于打字稿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)```

0 个答案:

没有答案