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

Danvk

如果我在TypeScript中创建此常量:

const PARAMS = {
  green: {color: 0x007700},
  black: {color: 0x000000},
  white: {color: 0xffffff},
};

它推导类型为{ green: {color: number}; black: { color: number }; white: { color: number }; }

但是我从上下文知道值的类型应该是THREE.MeshBasicMaterialParameters我可以使用索引类型进行声明:

const PARAMS: {[name: string]: THREE.MeshBasicMaterialParameters} = {
  green: {color: 0x007700},
  black: {color: 0x000000},
  white: {color: 0xffffff},
};

但后来我失去了按键的特定可能性(“绿色”,“黑色”或“白色”)。我可以通过写出所需的完整类型来更精确地建模:

const PARAMS: {
  green: THREE.MeshBasicMaterialParameters,
  black: THREE.MeshBasicMaterialParameters,
  white: THREE.MeshBasicMaterialParameters
} = {
  green: {color: 0x007700},
  black: {color: 0x000000},
  white: {color: 0xffffff},
};

但这是非常冗长和重复的。

有没有一种方法可以更简洁地获取我想要的类型?

蒿甲醚

您可以通过使用通用映射类型来减少冗长

type ParamsType<Colors extends string> = {
    [c in Colors]: THREE.MeshBasicMaterialParameters;
}

const PARAMS: ParamsType<'green' | 'black' | 'white'> = {
  green: {color: 0x007700},
  black: {color: 0x000000},
  white: {color: 0xffffff},
};

但是您仍然必须重复两次颜色名称。如果要打字稿来推断键,则必须引入中间函数,在运行时完全没有用。我不知道有什么其他方法可以使Typescript推断通用参数-github上有一项提议可以允许推导默认模板参数,但是到目前为止没有实现。

function inferColorKeys<Colors extends string>(params: ParamsType<Colors>): ParamsType<Colors> {
    return params;
}


const PARAMS = inferColorKeys({
  green: {color: 0x007700},
  black: {color: 0x000000},
  white: {color: 0xffffff},
});

更新

您可以使它成为完全通用的,如@jcalz所建议的那样,方法是使inferKeys该函数成为一个带有显式通用参数的函数,并返回一个推断其通用参数的函数。它必须是两个函数,因为一个函数不能具有一些显式的通用参数和某些推断的参数。而且,它利用了Record定义为的内置类型type Record<K extends string, V> = {[k in K]: V}

const inferKeys = <V>() => <K extends string>(x: Record<K,V>): Record<K,V> => x;

const PARAMS = inferKeys<THREE.MeshBasicMaterialParameters>()({
    green: {color: 0x007700},
    black: {color: 0x000000},
    white: {color: 0xffffff},
});

的类型PARAMS推断为

Record<"green" | "black" | "white", THREE.MeshBasicMaterialParameters>

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在方法签名中指定鸭子类型吗?

我可以从输入参数推断类型吗?

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

我可以使用类型作为值(或从构造函数参数正确推断通用类类型)吗?

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

可以为参数类型推断嵌套对象的键吗?

在TypeScript中,我可以从函数重载中推断映射类型吗?

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

您可以在Python类型注释中指定差异吗?

我可以使用 extends keyof Type 推断值的类型吗

我可以将字典的值分成多列,但仍然可以绘制它们吗?

我可以在TypeScript中将参数类型指定为多种类型之一吗?

在Typescript中的对象文字中指定值的类型?

我可以修改列表中指定的单个值吗?

是否可以将任务的类型推断为通用类型,而无需在表达式中指定它?

指定其他类型时,如何让TypeScript推断受约束的泛型类型的值?

我可以使用 Typescript 泛型根据类型从对象中过滤键吗?

我可以在以编程方式生成的TypeScript接口/类型的键上添加前缀或后缀吗?

Spring Boot Astra Cassandra - 在 application.yml 中指定了键空间,但仍然抛出错误“未指定键空间”

在TypeScript箭头函数中指定返回类型

我可以在编译器指令中推断类型的类型吗

变量模板可以推断类型吗?

C ++模板可以推断返回类型吗?

我们可以为字典中的键分配2种类型的值吗

你能让 TS 从被赋值的值中推断出变量的泛型类型参数吗?

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

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

是否可以从参数中提取键以进行Typescript中的类型推断?

可以指定C ++ 20模板化的lambda来推断嵌套在参数中的类型吗?