TypeScript.Record<> 其中的值取决于键。Record<>其中的值取决于键值

我想写这样的东西。

const structs: Record<T extends StructureConstant,Array<ConcreteStructure<T>>> = Object.create(null);

哪儿 StructureConstant 是一个常数的结合,而 ConcreteStructure 基本上是 类型查询.

在TypeScript中可以这样做吗?我不知道如何使值依赖于键。


这里有一个完整的例子。

type StructureConstant = "road" | "tower";

interface Road {
    a: "i am a road",
}

interface Tower {
    b: "i be towerin"
}

type ConcreteStructure<T extends StructureConstant> = T extends "road"
    ? Road
    : T extends "tower"
    ? Tower
    : never;

type StuctureRecord<T extends StructureConstant> = Record<T, Array<ConcreteStructure<T>>>

const structs: StuctureRecord<StructureConstant> = Object.create(null); 

const roads = structs["road"]; // should be Array<Road>|undefined

console.log(roads[0].a); // should work (if structs was populated)

TS游乐场

解决方案:

在typecript中,只有函数值可以有通用类型。其他值需要完全指定。

所以也许你想要这样的东西。

type StuctureRecord<T extends StructureConstant> = Record<T, Array<ConcreteStructure<T>>>

// structs doesn't have a generic type.
const structs: StuctureRecord<StructureConstant> = Object.create(null); 

或者

// function can have generic type.
const structsCreator = <T extends StructureConstant>(): Record<T, Array<ConcreteStructure<T>>> => Object.create(null) 

const structs = structsCreator<StructureConstant>()

游乐场


为了获得所述效果,你不能使用Record。一个Record可以将所有键映射到同一类型。如果你需要为每个条目使用不同的类型,你需要自定义映射类型

type StuctureMappedType<T extends StructureConstant> = 
    { [K in T]: Array<ConcreteStructure<K>>}

游乐场

给TA打赏
共{{data.count}}人
人已打赏
未分类

亚马逊Lightsail邮件无法正常使用,没有任何错误

2022-9-8 21:16:42

未分类

如何显示所有列的单独博平图?

2022-9-8 21:27:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索