来自Typescript中对象的键和值的类型

dx_over_dt:

我有两组字符串值,我希望将它们作为常量对象从一组映射到另一组。我想从该映射生成两种类型:一种用于键,一种用于值。

const KeyToVal = {
    MyKey1: 'myValue1',
    MyKey2: 'myValue2',
};

按键很简单:

type Keys = keyof typeof KeyToVal;

我在获取值的编译时类型时遇到麻烦我认为也许其中一种会起作用:

type Values = typeof KeyToVal[Keys];
type Values<K> = K extends Keys ? (typeof KeyToVal)[K] : never;
type Prefix<
    K extends Keys = Keys, 
    U extends { [name: string]: K } = { [name: string]: K }
> = {[V in keyof U]: V}[K];

所有这些只是做的Valuesstring我还尝试调整了两个答案,以适应如何使用打字稿中的查找来推断类型化的mapValues?,但要么我改写错误,要么答案根本不适合我的情况。

artem:

编译器会将字符串文字类型扩展为string,除非满足某些特定条件,如github issuePR中所述,或者将const断言用于文字值。Const断言出现在TypeScript 3.4中:

const KeyToVal = {
    MyKey1: 'myValue1',
    MyKey2: 'myValue2',
} as const;

type Keys = keyof typeof KeyToVal;
type Values = typeof KeyToVal[Keys]; //  "myValue1" | "myValue2"

在3.4之前,有一种变通办法可以达到相同的效果。为了使编译器推断文字类型,您必须通过具有适当设计的泛型类型参数的函数传递对象,这种情况似乎可以解决这种情况:

function t<V extends string, T extends {[key in string]: V}>(o: T): T {return o}

该功能的全部目的是捕获和保留类型以启用类型推断,否则它完全没有用,但是有了它,您可以拥有

const KeyToVal = t({
    MyKey1: 'myValue1',
    MyKey2: 'myValue2',
});

type Keys = keyof typeof KeyToVal;
type Values = typeof KeyToVal[Keys]; //  "myValue1" | "myValue2"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript中的对象索引键类型

从TypeScript中的函数返回对象(具有特定键,值类型)

如何从Typescript中的固定对象的键创建映射类型

TypeScript:如何为具有许多相同类型的键和相同类型的值的对象创建接口?

TypeScript中的键和值类型

如何使Typescript推断对象的键但定义其值的类型?

在TypeScript中按值类型排除对象键

流程:指定键的类型和对象的值

如何在Angular / TypeScript中声明键为日期和值为布尔值的对象

TypeScript-强制对象中特定键的类型

如何从TypeScript中的类型化对象中动态删除键

TypeScript中是否可以直接从对象的键创建新类型?

具有特定键和值集的TypeScript类型

从JSON对象中选择值,其中Typescript类型的键

从对象和键数组中查找值

Typescript-键到类型和值的类型安全映射

Javascript 从对象中获取键和值

在 Typescript 中约束对象的值类型

在 TypeScript 中为包含 Map 和其他键的对象创建类型

如何仅收集类型中的键,该类型的对象具有某些特定键作为 Typescript 接口中的值?

来自其他类型的键和值的类型

来自元组的 Typescript 文字对象,其中键和值相同

TypeScript:如何从类型中仅提取类型数组的键和值

TypeScript - 基于类型对象在函数 sig 中映射键类型与值类型

从 Typescript 中对象数组的属性中提取键/值对象类型

从对象数组中删除键和值

类型“键”不能用于索引 TypeScript 中的类型“对象”

如何从 TS 文字联合类型推断对象的键和值?

从 Typescript 中的属性值推断对象的类型