给定一组令牌:
const myArray = <const>[
{
tokens: ["one", "two"],
},
{
tokens: ["three"],
},
{
tokens: [],
},
{
somethingElse: {},
},
];
我想为 tokens 属性所具有的所有不同文字获取一个元组。在上面的例子中,结果应该是 "one" | "two" | "three"
,但是我所有的尝试都会产生 any
,除非我删除了第三个数组项。
这是我试过的:
type ArrayItem = typeof myArray extends (infer T)[] ? T : never;
type ArrayItemWithTokens = Extract<ArrayItem, { tokens: [string] }>;
type TokenArrays = ArrayItemWithTokens extends { tokens: infer T } ? T : never;
type Token = TokenArrays extends (infer T)[] ? T : never;
答案 0 :(得分:2)
const myArray = [
{
tokens: ["one", "two"],
},
{
tokens: ["three"],
},
{
tokens: [],
},
{
somethingElse: {},
},
] as const;
type Token = Extract<(typeof myArray)[number], {tokens: unknown}>['tokens'][number];