【问题标题】:How does keyof typeof generic constraint work?keyof typeof 泛型约束如何工作?
【发布时间】:2020-12-24 16:03:42
【问题描述】:

What does "keyof typeof" mean in TypeScript?

我发现上面的问题作者问的和我想问的完全一样,但是没有答案找到问题的重点。

假设有这个泛型方法和一个类。

function fn<K extends keyof typeof A>(key: K) ...

class A {
    static a;
    static b;
}

我的理由是:

  1. typeof 关键字返回一个字符串,显示 js 基本类型之一。

  2. 所以无论值是什么,返回类型都是字符串。

  3. 所以 keyof "..." 应该是索引和 "length" 以及字符串文字可以具有的东西。在这种情况下,keyof "function" 应该返回类型 "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | “长度”。

  4. 但实际行为是 typeof 类 A 返回构造函数。

怎么会这样?

【问题讨论】:

  • "typeof 关键字返回一个字符串,表示其中一种 js 基本类型。" False,typeof 在 Typescript 中在此上下文中具有不同的含义。 typescriptlang.org/docs/handbook/2/…
  • 不知道很多打字稿我发现链接到问题的答案是非常信息。即使其中一个的风格不符合您的喜好,也有多个似乎不错的答案,因此您可以阅读多个答案并选择对您最有帮助的一个。我投票关闭,因为我认为这完全是重复的。
  • 这能回答你的问题吗? What does "keyof typeof" mean in TypeScript?
  • @JoachimSauer 当然不是因为我提到了问题顶部的问题。问题的答案中没有行为的来源。我的问题和我想要的来源以及 typeof 可能意味着多种事情的事实,因为我们已经知道了这种行为。
  • @kaya3 非常感谢。如果您将其发布,我会选择您的答案。您的评论实际上是我想要的真正答案。

标签: typescript


【解决方案1】:

typeof 关键字返回一个显示 js 基本类型之一的字符串。

这对于 JavaScript 来说是正确的,但在 Typescript 中,typeof 可以表示多种含义,具体取决于上下文。与 JS 不同,在 TS 中,当 typeof 处于预期 type 的上下文中时,typeof expression 将评估为 expression 的(TypeScript 确定的)类型。例如:

let num = 5;
type Num = typeof num;

导致Num 类型为number。这不是 string 'number' - 它是 TypeScript 类型 number

所以,在你的代码中:

function fn<K extends keyof typeof A>(key: K) ...

由于K extends keyof ... 是一个type 上下文(这对于配置TypeScript 对代码的解释很有用,但在发出的JavaScript 中不存在),以下typeof 指示TypeScript 替换typeof A 具有 TypeScript 检测到的 A 类型。

相比之下,当不是在类型上下文中时:

let someStr = 'foo';
const theType = typeof someStr;

这里,typeofruntime JavaScript 中使用,在发出的代码中,而不是作为特定于 TypeScript 的语法,因此它导致 theType 被分配值 'string' 在运行时。

typeof 的两种使用方式完全不同。

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多