【问题标题】:Is it possible to get the value (not key) in a literal object as a literal, not its type (such as string) via mapped type in Typescript?是否可以通过 Typescript 中的映射类型将文字对象中的值(不是键)作为文字而不是其类型(例如字符串)获取?
【发布时间】:2021-01-15 14:17:38
【问题描述】:

下面,我有一个文字对象 {a:"a"}。我想将对象的值提取为文字“a”,而不是其类型字符串,以便检查其他变量是否为“a”而不是任何其他字符串。

但是,如果我使用映射类型,我只会得到字符串,而不是“a”。

有没有办法将值作为类型获取?

const a = {a:"a"}
type trueIfLiteral<T extends string>= string extends T?false:true;

type key = keyof typeof a;
const t1 : trueIfLiteral<key> = true; // key is literal

type val = typeof a[key];
const t2 : trueIfLiteral<val> = false; // val is string

所以问题很简单,我怎样才能得到一个类型:

type valAsLiteral = "a"

【问题讨论】:

    标签: typescript typescript-typings mapped-types


    【解决方案1】:

    首先,为了让对象稍微不那么混乱,我们称它为obj,并带有属性keyval

    const obj = { key: "val" };
    

    这里的一个问题是对象被键入为{ key: string }。 TypeScript 自动将 'val''val' 扩展为字符串。如果你想防止这种扩大,你可以声明对象as const

    const obj = { key: "val" } as const;
    

    这会导致您的代码正常工作,并且

    type val = typeof obj[key];
    

    产生'val'(而const t2 : trueIfLiteral&lt;val&gt; = false; // val is string 失败,因为val 不再是通用字符串,而只是val

    要在发出的 JS 中获取值,而不是在 TS 中,您可以这样做

    const val = Object.values(obj)[0];
    

    生成'val',输入为'val',没有类型扩展。

    【讨论】:

    • 谢谢!打字稿总是有惊人的惊喜!强大而迷人!
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多