Typescript:从字符串索引签名中排除特定字符串


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]

最新更新