推断数组对象的键类型



我有下一个例子

type C = [
{name: 'a'},
{name: 'b'},
{name: 'c'},
]

我想根据上面描述的类型C推断出一个新的类型SomeType,就像这样

const a: SomeType<C> = {
a: () => {},
b: () => {},
c: () => {},
}

这样就可以检查所有键。以下示例必须为无效

const a: SomeType<C> = {
a: () => {},
b: () => {},
// Error. "c" is not defined
}

我试图解决我的问题,就像在操场上,但我的解决方案没有检查所有的键

这里有一个方法:

type SomeType<T extends { [k: number]: { name: string } }> =
Record<T[number]['name'], () => void>;

它接受T约束为具有数字索引签名的类型(例如数组),其元素具有string类型的name属性。

它的计算结果是一个类型,其键是string可分配的name属性(使用T[number]['name'],一系列索引访问类型),其值类型是一个函数(我选择() => void,但您可能有更具体的类型)。它使用Record<K, V>实用程序类型来表示具有K类型键和V类型值的对象类型。

让我们试一试:

const ports: SomeType<C> = { // error, missing b and c
a: () => { },
}    
const ports2: SomeType<C> = {
unknownkey: () => { }, // error, unknown key in object literal 
// (note, only errors for object literal)
}
const ports3: SomeType<C> = { // okay
a: () => { },
c: () => { },
b: () => { },
}

看起来不错!

Playground链接到代码

您需要一个映射类型来从数组类型映射到您想要的类型:

type SomeType<T extends Array<{ name: string }>> = {
[P in T[number]['name']]: () => void
}

操场上联系

相关内容

  • 没有找到相关文章

最新更新