Typescript 当定义另一个属性时,使该属性成为必需属性(区分并集)

Typescript 当定义另一个属性时,使该属性成为必需属性(区分并集),typescript,Typescript,我想写一个类型,允许创建对象,其中包含一些始终必需的核心属性和可选属性imageUrl,当定义为字符串时,意味着imageAltText也需要作为字符串 { id: "test", imageUrl: "test", imageAltText: "test" } 我还希望它能够工作,以便在未定义imageUrl时,我不希望定义imageAltText { id: "test" } 我定义了如下类型: (

我想写一个类型,允许创建对象,其中包含一些始终必需的核心属性和可选属性
imageUrl
,当定义为字符串时,意味着
imageAltText
也需要作为字符串

{
 id: "test",
 imageUrl: "test",
 imageAltText: "test"
}
我还希望它能够工作,以便在未定义
imageUrl
时,我不希望定义
imageAltText

{
 id: "test"
}
我定义了如下类型:

(
  {
    /** image url for the banner of the card. Will display a blue background without an image */
    imageUrl?: undefined;
  } 
| 
  {
    /** image url for the banner of the card. Will display a blue background without an image */
    imageUrl: string;
      /** alternative text for the banner image */
    imageAltText: string;
  }
)

However, by making `imageUrl` optional `?` typescript allows me to write `imageAltText` even when `imageUrl` is undefined. 
给你:


类型RequiredParams={
id:字符串
}&T
类型UnionParams=
|所需参数
|所需参数
类型UnionKeys=T扩展T?基特:永远不会;
类型为StrictUnionHelper=
T扩展任何
? T&Partial:从不;
类型StrictUnion=StrictUnionHelper
类型结果=StrictUnion
常量a:Result={id:'sdf'};//好啊
常量b:Result={id:'sdf',imageUrl:'sdf',imageAltText:'sdf'}//ok
常量c:Result={id:'sdf',imageUrl:'sdf'}//错误
常量d:Result={id:'sdf',imageAltText:'sdf'}//错误
所有gredit都转到

类型Props={
[P in keyof T]?:从不;
}
类型OptionalImagePart={
imageUrl:字符串;
imageAltText:字符串;
}
类型Image={id:number;}&(OptionalMagePart | Props)
常量image1Ok:图像={
身份证号码:1
}
常量image2Ok:图像={
id:1,
imageUrl:“imageUrl”,
imageAltText:“imageAltText”
}
常量image3Error:Image={//预期错误
id:1,
imageUrl:“imageUrl”
}
常量image4Error:Image={//预期错误
id:1,
imageAltText:“imageAltText”
}

谢谢,我试试看。虽然我很惊讶我们不得不用这么多的助手来帮助你,你可以考虑“Lasiak”的解决方案。也许有更简单的解决方案。有很多TS问题可以通过几种方式解决
type ForbidProps<T> = {
  [P in keyof T]?: never;
}

type OptionalImagePart = {
  imageUrl: string;
  imageAltText: string;
}

type Image =   { id: number; } & (OptionalImagePart | ForbidProps<OptionalImagePart>)

const image1Ok: Image = {
  id: 1
}

const image2Ok: Image = {
  id: 1,
  imageUrl: 'imageUrl',
  imageAltText: 'imageAltText' 
}

const image3Error: Image = { // Expected error
  id: 1,
  imageUrl: 'imageUrl' 
}

const image4Error: Image = { // Expected error
  id: 1,
  imageAltText: 'imageAltText' 
}