gpt4 book ai didi

typescript - 我可以指定一个属性也需要设置另一个属性吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:09 25 4
gpt4 key购买 nike

这是一个例子。假设我不控制数据格式。

type Thing = {
name: string
}

// if you canJump, you need to specify howHigh
type Jump = {
canJump: true
howHigh: number
}

// MightJump Things either jump or don't
type MightJump = Thing | (Thing & Jump)

const thing: MightJump = {
name: 'hi',
canJump: true,
// howHigh: 5, // how do I make commenting this out an error?
}

因此,理想情况下,对于类型为 MightJump 的值,如果只设置了 name,那很好,但是如果 canJumphowHigh 已设置,该对中的另一个也是必需的。

这在 TypeScript 中可行吗?如果不是,需要对编译器进行何种方式的更改才能支持它?我对限制的确切性质非常感兴趣。

据我所知,Thing | (Thing & Jump) 生成一个类型,其中 canJumphowHigh 都是可选的,只有 name 是必需的。

更新:使用以下 artem 的回答:

type OptNever<T> = {
[K in keyof T]?: never
}

type AllOrNone<T> = T | OptNever<T>

type MightJump = Thing & AllOrNone<Jump>

最佳答案

您可以通过给它一个可选的 never 类型来禁止联合类型的成员中存在一个属性:

type Thing = {
name: string
}

// if you canJump, you need to specify howHigh, and vice versa
type JumpOrNot = { canJump?: never; howHigh?: never} | {
canJump: true
howHigh: number
}

// MightJump Things either jump or don't
type MightJump = Thing & JumpOrNot

const thing: MightJump = {
name: 'hi',
canJump: true,
// error
// Type '{ name: string; canJump: true; }' is not assignable to type 'MightJump'.
// Type '{ name: string; canJump: true; }' is not assignable to type 'Thing & { canJump: true; howHigh: number; }'.
// Type '{ name: string; canJump: true; }' is not assignable to type '{ canJump: true; howHigh: number; }'.
// Property 'howHigh' is missing in type '{ name: string; canJump: true; }'.
}

const thing1: MightJump = {
name: 'thing1'
}

const thing2: MightJump = {
name: 'thing2',
canJump: true,
howHigh: 5,
}

关于typescript - 我可以指定一个属性也需要设置另一个属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50514039/

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