由于升级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的新手,非常感谢您的帮助。
致谢
答案 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();
}
}
}