【问题标题】:Extract type from alias generic从别名泛型中提取类型
【发布时间】:2021-05-01 17:44:46
【问题描述】:

我正在尝试提取泛型的类型,但无法访问它。所以我不能使用Extract

import { Feather } from '@expo/vector-icons'

// The type is the following but isn't exported
const Feather: Icon<"crosshair" | "database" | "disc" | "zap" | "droplet" | "sun" | "wind" | "feather" | "link" | "search" | "image" | "menu" | "radio" | "key" | "code" | "map" | "video" | "circle" | ... 267 more ... | "zoom-out", "feather">

// ... how to get it icon list enum?

我正在尝试使用 "crosshair" | "database" | "disc" | "zap" ... 获取类型

我也试过这个answer

type TypeOfFeather = typeof Feather
type extractGeneric<T> = T extends TypeOfFeather <infer X> ? X : never

这显然不起作用,因为TypeOfFeather 不是通用的。我是 Typescript 的初学者,所以我真的不知道如何解决这个问题。

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    您将Feather 作为一种类型,而在您的示例中它实际上是一个变量,但您几乎就在那里(playground),这让我感到有点奇怪:

    type Icon<T> = {
      _: T;
    };
    
    declare const Feather: Icon<"a" | "b">;
    
    // If Feather is actually a type and your example was wrong, just drop the "typeof".
    type Result = typeof Feather extends Icon<infer U> ? U : never; // "a" | "b"
    

    附带说明,如果您提供包含所有相关类型定义(或其存根)的完整工作的最小示例,这将对我们非常有帮助,从而对您直接有益。 同样,你实际上并没有给出预期的结果(只是一个模糊的描述),这迫使我们猜测/假设你想要做什么;在这里说“我正在寻找"a" | "b"”。

    【讨论】:

    • 确实,我的问题写得太快了,我试图做的确实是从type TypeOfFeather = typeof Feather 中提取代码而不是变量本身。我还按照您的建议改进了预期结果部分。谢谢你的好建议。我认为您的回答很好,但在我的情况下不起作用。我会尝试找出问题所在以改进我的问题
    • 问题是该包不导出任何类型(Icon 也不是完整列表)。所以我不能做typeof Feather extends Icon 也许我只是卡住了,我应该从react-native-vector-icons 导入Icon@expo 只是简单地包装——不导出类型..)但这意味着维护一个更多的依赖。不过,从纯理论的角度来看,我仍然对可能的答案感兴趣。
    • 查看库,您可能也可以使用keyof Feather['glyphMap']。您也可以自己声明一个“填充”Icon 类型(TS 是结构性的,而不是名义上的)。我认为除了这些之外,您的选择越来越少。
    • 确实我让'glyphMap`可用,但它并没有触发我......我的错。所以keyof typeof Feather['glyphMap'] 完成了这项工作? 非常感谢将您的答案标记为已接受,即使答案实际上在 cmets 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    相关资源
    最近更新 更多