TypeScript 代码中括号前括号中的强制转换/断言是什么意思?

pro*_*mer 5 javascript typescript

这是我正在查看的一些代码(我是 TypeScript 的新手):

    // Set up decorator
    const proxy = Object.create(null) as ts.LanguageService;
    const oldLS = info.languageService;

    for (const k in oldLS) {
        (<any>proxy)[k] = function () {
            return (<any>oldLS)[k].apply(oldLS, arguments);
        }
    }
Run Code Online (Sandbox Code Playgroud)

看这部分代码:

        (<any>proxy)[k] = function () {
            return (<any>oldLS)[k].apply(oldLS, arguments);
        }
Run Code Online (Sandbox Code Playgroud)

为什么需要强制转换,(<any>proxy)[k]因为并非所有对象都可以通过括号表示法访问?此外,为什么上面的赋值不是简单地写成:((<any>proxy)[k] = (<any>oldLS)[k];这段代码试图完成什么)?

jca*_*alz 5

从表面上看,您似乎是在要求我们解释为什么某个未知的人可能会在某些未指定的 TypeScript 代码中为某个未指定的 TypeScript 版本执行类型断言。不确定在那里有人怎么能真正帮助你。

但幸运的是,搜索引擎的神奇之处在于,您指的是本教程,用于用@RyanCavanaugh编写的 TypeScript 编写您自己的语言服务插件。


原因似乎是关键k被推断为string,而不是keyof ts.LanguageService,所以编译器废品进行索引proxy,并oldLSk,除非你做一些类型的声明。

我不确定为什么会发生这种情况;我认为从 TypeScript v2.1.4 开始,变量ainfor a in b 应该有 typekeyof typeof b

例如:

function hmm<T>(t: T): void {  
  for (const k in t) { // k is inferred as keyof T
    const keyofT: keyof T = k; // no error
  }
}
Run Code Online (Sandbox Code Playgroud)

但是在您包含的代码中string,出于某种原因,它仅推断为(也许知情人士可以解释一下)。

一旦 TypeScript 无法推断出您自己知道为真的内容,您通常可以通过注释(在双变量参数的情况下)或类型断言来强制编译器屈服于您的意愿。

就我而言,我可能会这样做:

    type K = keyof ts.LanguageService
    for (const k in oldLS) {
      proxy[k as K] = function() {
        return oldLS[k as K].apply(oldLS, arguments);
      }
    }
Run Code Online (Sandbox Code Playgroud)

但这是一个判断。

希望有所帮助;祝你好运。