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

插口

我想定义一个对象的类型,但是让Typescript推断键,并且没有太多开销来制作和维护所有键的UnionType。

键入对象将允许所有字符串作为键:

const elementsTyped: { 
    [key: string]: { nodes: number, symmetric?: boolean }
} = {
    square: { nodes: 4, symmetric: true },
    triangle: { nodes: 3 }
}

function isSymmetric(elementType: keyof typeof elementsTyped): boolean {
    return elementsTyped[elementType].symmetric;
}
isSymmetric('asdf'); // works but shouldn't

推断整个对象将显示错误,并允许所有类型的值:

const elementsInferred = {
    square: { nodes: 4, symmetric: true },
    triangle: { nodes: 3 },
    line: { nodes: 2, notSymmetric: false /* don't want that to be possible */ }
}

function isSymmetric(elementType: keyof typeof elementsInferred): boolean {
    return elementsInferred[elementType].symmetric; 
    // Property 'symmetric' does not exist on type '{ nodes: number; }'.
}

我得到的最接近的是这个,但它不想维护这样的键集:

type ElementTypes = 'square' | 'triangle'; // don't want to maintain that :(
const elementsTyped: { 
    [key in ElementTypes]: { nodes: number, symmetric?: boolean }
} = {
    square: { nodes: 4, symmetric: true },
    triangle: { nodes: 3 },
    lines: { nodes: 2, notSymmetric: false } // 'lines' does not exist in type ...
    // if I add lines to the ElementTypes as expected => 'notSymmetric' does not exist in type { nodes: number, symmetric?: boolean }
}

function isSymmetric(elementType: keyof typeof elementsTyped): boolean {
    return elementsTyped[elementType].symmetric;
}
isSymmetric('asdf'); // Error: Argument of type '"asdf"' is not assignable to parameter of type '"square" | "triangle"'.

有没有更好的方法来定义对象而不维护键集?

贾卡尔兹

因此,您需要一些可以推断键但限制值类型并使用多余属性检查来禁止多余属性的东西。我认为获得该行为的最简单方法是引入一个辅助函数:

// Let's give a name to this type
interface ElementType {
  nodes: number,
  symmetric?: boolean
}

// helper function which infers keys and restricts values to ElementType
const asElementTypes = <T>(et: { [K in keyof T]: ElementType }) => et;

这个辅助函数推断类型T从映射类型的et现在您可以像这样使用它:

const elementsTyped = asElementTypes({
  square: { nodes: 4, symmetric: true },
  triangle: { nodes: 3 },
  line: { nodes: 2, notSymmetric: false /* error where you want it */} 
});

该类型所产生的elementsTyped意志(一旦你修复错误)已经推断出密钥squaretriangle以及line与价值ElementType

希望对您有用。祝好运!

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript通过其键之一从对象推断信息

如何将类型定义为像 [key: string] 键/值结构这样定义的对象键列表 - TypeScript

TypeScript问题推断受限条件键类型的值类型

如何从条件键推断对象的值?

Typescript如何从常量属性值推断类型

如何推断对象的转换值的类型

如何基于现有对象值定义Typescript对象类型?

从对象的键推断通用类型

使用映射类型时,如何在TypeScript中推断对象属性的值?

为什么Typescript会推断出缺少键且没有未定义值的类型?

TypeScript通过其值类型缩小可索引类型的键

如何从字符串数组推断对象键的类型

带有字符串键的打字稿记录类型推断其值的无效类型

严格定义接受对象,修改其值并以TypeScript返回的函数的类型

如何约束对象的键但将值推断为const?

接口根据其定义的属性推断类型

TypeScript:如何推断分配值的确切类型

我可以在TypeScript中指定值类型,但仍然让TS推断键类型吗?

基于其参数类型的函数类型参数的TypeScript类型推断

如何在 TypeScript 中定义带有动态键的对象类型?

如何在TypeScript中从地图的自定义键类型获取对象?

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

如何推断对象属性的类型

动态访问对象属性的Typescript类型推断

推断 Typescript 中深层嵌套对象的类型

推断对象数组中特定键的值

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

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

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