TypeScript 2.4:“类LocalizationService错误地实现了接口ILocalizationService <LocalizedStrings>”

时间:2019-07-10 19:29:40

标签: typescript

由于升级TS版本,我遇到了一些问题。 升级之前,我安装了TS 2.3.3,并且没有任何问题,因此根据要求,我升级到TS 2.4,此版本给了我几个问题。

我有以下课程:

module DemoSample.Localization {
    export class LocalizationService implements someNamespace.Localization.ILocalizationService<LocalizedStrings> {
        constructor(private _localizationService: someNamespace.Services.ILocalizationService) {
        }
        load(): JQueryPromise<ILocalizedStrings> {
            var result = $.Deferred<ILocalizedStrings>();
            ...some dummy logic
            return result.promise();
        }
    }
}

实现具有通用类型的接口

declare module someNamespace.Localization {
    interface ILocalizationService<T> {
        load(): JQueryPromise<T>;
    }
}

和指定的类型:

module DemoSample.Localization {
    export class LocalizedStrings extends someNamespace.Localization.LocalizedStringsBase implements ILocalizedStrings {
        constructor() {
            super("Test Application");
        }
        ...another dummy logic
    }
}

所以我遇到以下错误:

  • Class LocalizationService incorrectly implements interface ILocalizationService<LocalizedStrings>
  • Types of property load are incompatible.
  • Type '() => JQueryPromise<ILocalizedStrings> is not assignable to type () => JQueryPromise<LocalizedStrings>'.
  • Type 'ILocalizedStrings' is not assignable to type 'LocalizedStrings'

因此,我正在研究关于版本2.4的重大更改,但没有找到有关具有泛型类型的接口的信息。

重大更改提到了更严格地检查泛型函数 https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#stricter-checking-for-generic-functions

我是否必须假定新的“功能”也对通用接口或类严格?

我是TypeScript的新手,非常感谢您的帮助。

致谢

1 个答案:

答案 0 :(得分:0)

严格的泛型类型检查(在TS 2.4中引入)似乎正在影响此代码块,因为我们指定ILocalizationService接口及其函数load()必须为同一类型,因此我们在它们上放置了两种不同的类型,即作为接口类型的类和作为load()函数类型的接口,因此两者不是同一类型,并且检查失败。

因此,解决该问题的解决方法是将 LocalizedStrings 类设置为相同的类型,因为该类已经实现了load()函数之前使用的接口,并且现在都使用相同的类型并且检查是否成功。

module DemoSample.Localization {
    export class LocalizationService implements someNamespace.Localization.ILocalizationService<LocalizedStrings> {
        constructor(private _localizationService: someNamespace.Services.ILocalizationService) {}
        load(): JQueryPromise<LocalizedStrings> {
            var result = $.Deferred<LocalizedStrings>();//the same class as the type
            ...some dummy logic
            return result.promise();
            }
    }
}