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'
}