typescript 从对象获取所有id的值作为类型

t98cgbkg  于 2023-03-09  发布在  TypeScript
关注(0)|答案(2)|浏览(227)

我有一个物体

var myObj = [{ id: 'a', value: 1}, { id: 'b', value: 2 }, { id: 'c', value: 3}]

我有一个函数我只想传递id的可能值

function abc(id: 'a' | 'b' | 'c') { /* */ }

我试过这样

var myObj = [{ id: 'a', value: 1}, { id: 'b', value: 2 }, { id: 'c', value: 3}]

type OJ = typeof myObj;
type id = keyof OJ[number]['id'];

但它的ID显示为type id = number | typeof Symbol.iterator | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | "match" | "replace" | "search" | "slice" | ... 30 more ... | "padEnd"

t5fffqht

t5fffqht1#

如果从type id = keyof OJ[number]['id'];中删除keyof,则错误将得到修复。这将使idstring匹配。如果需要更具体的类型,例如,希望id"a" | "b" | "c",则可以在对象后给予as const

function abc(id: 'a' | 'b' | 'c') { /* */ }

var myObj = [{ id: 'a', value: 1}, { id: 'b', value: 2 }, { id: 'c', value: 3}] as const

type OJ = typeof myObj;
type id = OJ[number]['id'];
//    ^?

运动场

oyxsuwqo

oyxsuwqo2#

您的type id中不需要keyof

const myObj = [{ id: 'a', value: 1}, { id: 'b', value: 2 }, { id: 'c', value: 3}];

type OJ = typeof myObj;
type id = OJ[number]['id'];

但是,使用这种方法,id的类型将是string,因为TypeScript认为myObj是开放式的,您可以在以后向myObj添加其他元素。
要防止出现这种情况,请使用constAssert:

const myObj = [{ id: 'a', value: 1}, { id: 'b', value: 2 }, { id: 'c', value: 3}] as const;

type OJ = typeof myObj;
type id = OJ[number]['id'];

相关问题