gpt4 book ai didi

typescript - 从联合类型创建类似记录的类型

转载 作者:行者123 更新时间:2023-12-05 01:36:59 24 4
gpt4 key购买 nike

在 Typescript 中,我创建了一个具有共享“类型”属性的联合类型:

export type Instruction =
| { type: 'local.set', name: string, value: Expression }
| { type: 'i32.const', value: number }
| { type: 'i32.add', left: Expression, right: Expression };

我想创建一个对象,将“type”属性的值作为键,将函数作为值。像这样:

const visitor: Record<Instruction['type'], (instruction: Instruction) => void> = {
'local.set': (instruction) => {},
'i32.const': (instruction) => {},
'i32.add': (instruction) => {},
}

但是“指令”参数的类型对我来说太笼统了。我想知道我可以从函数内的指令访问哪些属性。那么我如何使用 Instruction 类型中“type”属性的所有键及其各自的 Instruction 类型创建一个类似 Record 的类型作为值(value)?

换句话说;如果我这样做, typescript 可以推断类型:

const instruction: Instruction = { type: 'local.set' }; // TS knows about the missing 'name' and 'value' properties

但是我想做这样的事情:

const instruction: Instruction[where type = 'local.set'] = { type: 'local.set' };

这可能吗?如何实现?

最佳答案

您可以使用自定义映射类型来映射 type 的联合,然后使用 Extract 条件类型从 Instruction 中获取联合成分code> 与当前属性具有相同类型:

export type Instruction =
| { type: 'local.set', name: string, value: Expression }
| { type: 'i32.const', value: number }
| { type: 'i32.add', left: Expression, right: Expression };

type Visitor<T extends { type: string}> = {
[P in T['type']]: (instruction: Extract<T, { type: P }>) => void
}
const visitor: Visitor<Instruction> = {
'local.set': (instruction) => { instruction.name},
'i32.const': (instruction) => { instruction.value },
'i32.add': (instruction) => { instruction.right },
}

Playground Link

关于typescript - 从联合类型创建类似记录的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com