繁体   English   中英

有没有办法让 typescript 使用 typescript 中定义的 object 的宽键来键入?

[英]Is there a way for typescript to type using broad keys of a defined object in typescript?

const obj: {[key: string]: string} = {foo: 'x', bar: 'y'};

type ObjType = keyof typeof obj;

在不修改obj的类型的情况下,如何让ObjType只接受“foo”或“bar”而不接受任何字符串?

这不能在 typescript 4.8 上完成。 您不能限制类型,并获取该类型的更具体版本以在同一分配中使用。

典型的解决方法是使用通用的 function,这有点糟糕。

function makeObj<T extends { [key: string]: string }>(obj: T) {
    return obj
}

const obj = makeObj({foo: 'x', bar: 'y'})

type ObjType = keyof typeof obj // 'foo' | 'bar'

看游乐场


但是,下一个版本的 typescript (4.9) 似乎可能包含satisfies运算符。 请参阅此 github 问题

这将允许您应用约束,并一次推断出更具体的类型。

const obj = {foo: 'x', bar: 'y'} satisfies { [key: string]: string }

type ObjType = keyof typeof obj // 'foo' | 'bar'

看游乐场


但无论哪种方式,您都必须修改obj的声明方式才能使这些工作正常进行。

让推理完成工作:

const obj = {foo: 'x', bar: 'y'};

type ObjType = keyof typeof obj; //  "foo" | "bar" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM