interface Link {
href: string;
}
type MandatoryPaginationLinks = {
[key in 'first' | 'last']: Link;
}
type OptionalPaginationLinks = {
[key in 'prev' | 'next']: Link | null;
}
type PaginationLinks = MandatoryPaginationLinks & OptionalPaginationLinks;
type AdditionalLinks = {
[key: string]: Link;
};
type Links = PaginationLinks & AdditionalLinks;
const links: Links = {
self: {
href: 'asdf'
},
prev: null,
next: {
href: '',
},
first: {
href: 'asdf'
},
last: {
href: 'asdf'
}
};
我有一个链接类型。必须设置第一个和最后一个属性,并且必须是Link
。prev和next属性可以是Link还是null。可选链接必须具有Link
类型。问题是Typescript将"first"、"last"、"prev"one_answers"next"视为string
,因此表达式始终映射到AdditionalLinks
类型。我想要一个从string
类型中排除这四个字符串的解决方案。例如(不工作(:
type AdditionalLinks = {
[key: Omit<string, 'first' | 'last' | 'prev' | 'next'>]: Link;
};
我认为你想要的是不可能的。但作为一种替代解决方案,您可以使用symbol
而不是AdditionalLinks
中的string
密钥。因此CCD_ 9不干扰CCD_ 10符号密钥。
type AdditionalLinks = {
[key: symbol]: Link;
};
接下来你可以这样定义links
:
const links: Links = {
[test]: {
href: 'asdf'
},
prev: null,
next: {
href: '',
},
first: {
href: 'asdf'
},
last: {
href: 'asdf'
}
};
您可以声明一个符号:
const test = Symbol('test');
例如,你可以得到一个符号类型的密钥的值,如下所示:
links[test]