打字稿:意外未知

Jen*_*ens 8 typescript

我最近一直在使用 TypeScript,偶然发现了一个让我感到困惑的问题。我已将问题放入一个示例中,如下所示:

type Options<T> = {
  props: T;
  g: (x: T) => void;
};

function f<T>(options: Options<T>) {
  console.log(options);
}

// Example 1 (x and props expected type)
f({
  props: {
    foo: {
      a: 200,
      bar: () => {}
    }
  },
  g(x) {
    // x is the expected type
    console.log(x)
  }
});

// Example 2 (x and props unknown)
f({
  props: {
    foo: {
      a: 100,
      bar: function() {}
    }
  },
  g(x) {
    // x is unknown
    console.log(x)
  }
});
Run Code Online (Sandbox Code Playgroud)

props在第一个示例中悬停时,您将看到它具有预期的类型。尽管在第二个示例中几乎没有任何变化,但props类型是unknown。这是为什么?这是上面TS Playground 中的示例。

jca*_*alz 8

这是 TypeScript 的设计限制;请参阅microsoft/TypeScript#38845。显然(来自此评论):

不带参数的箭头功能不是上下文敏感的,但没有参数的函数表达式因为隐式的上下文敏感的this参数。任何上下文敏感的东西都被排除在类型推断的第一阶段,这是确定我们将用于上下文类型参数的类型的阶段。

Tfoo.bar属性是箭头函数时,似乎推断成功,因为无需this担心上下文。因此,上下文类型已成功分配给 的x参数g,一切都按您的意愿进行。但是当 的值foo.bar是一个函数表达式时,编译器需要上下文来弄清楚是什么this,并且T无法及时推断以找出g的参数的上下文类型,最终变成unknown.