gpt4 book ai didi

typescript:创建适合对象字面量值的类型

转载 作者:行者123 更新时间:2023-12-02 03:23:58 25 4
gpt4 key购买 nike

给定这个对象文字...

const views = {
default: 'DEFAULT',
user: {
home: 'HOME',
profile: 'PROFILE'
}
}

我想要获得如下所示的类型,而不必以多种方式定义它,例如定义联合类型,然后定义嵌入所有类型的对象文字

interface State {
view: `DEFAULT' | 'HOME' | 'PROFILE'
}

我可以在 Typescript 中实现这一点吗?

编辑:

我可以定义字符串的联合类型

type View = 'HOME' | 'DEFAULT' | 'PROFILE'

然后声明对象文字(具有与上面类型相同的值),但随后我必须以多种方式定义它,并且我会重复自己

最佳答案

如果我没猜错的话,这就是你想要的:

type View = 'HOME' | 'DEFAULT' | 'PROFILE'

interface Views {
[key: string]: View | Views
}

const views: Views = {
default: 'DEFAULT',
user: {
home: 'HOME',
profile: 'PROFILE'
},
wrong: 'SOME_STRING', // error
}

UPD,评论后。现在,如果您希望对象文字成为所有可能字符串的引用,您可以天真地这样做:

const views = {
default: 'DEFAULT',
user: {
home: 'HOME',
profile: 'PROFILE'
},
}

// Make some peculiar types to extract all the strings
type Views = typeof views

type Strings<Obj> = Obj[keyof Obj]
type FlatStrings<T> = T extends object ? T[keyof T] : T

type View = FlatStrings<Strings<Views>>

但是猜猜View有什么类型?它只是字符串!不是默认 |首页 |如预期的那样。因为 typescript 从对象文字字符串推断类型 string ,除非您像这样重写对象文字:

const views = {
default: 'DEFAULT' as const,
user: {
home: 'HOME' as const,
profile: 'PROFILE' as const
},
}

关于typescript:创建适合对象字面量值的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com