ts对象/联合类型/索引签名的一点探索

233 阅读1分钟
type test = {
    a: 1,
    b: 2
}
type testValue = test[keyof test] // 1 | 2

以上可以把对象的值组成一个联合类型。

如果是元组中的对象呢?

[number]可以将元组转为联合类型。

这时候keyof,取到的是联合类型中,各个对象的键的交集。

没有交集则never。

type test = [
    {
        a: "aa",
        b: "bb",
    },
    { 
        c: "cc",
    }
]

type testUnion = test[number];
/*
{
    a: "aa";
    b: "bb";
} | {
    c: "cc";
}
*/

type testUnionKey = keyof testUnion // never
type testUnionValue = testUnion[keyof testUnion] // never

对应的,对象的键取到交集。

如下所示取对象的值,会将各种情况组成一个联合类型。

type test = [
    {
        a: "aa",
        b: "bb",
    },
    { 
        a: "aaa",
    }
]

type testUnion = test[number];
/*
{
    a: "aa";
    b: "bb";
} | {
    a: "aaa";
}
*/

type testUnionKey = keyof testUnion // "a"
type testUnionValue = testUnion[keyof testUnion] // "aa" | "aaa"