是否有可能从Typescript的字面联合中删除更宽的类型?



我正在使用React和Typescript,构建一个自定义输入组件,我希望从input元素的type属性中清除允许的值,以防止意外地用作'按钮'和'隐藏'。

type属性具有HTMLInputTypeAttribute类型,这是一个以(string & {})结束的联合类型。我不希望组件接收的类型值不是联合中描述的文字。

使用Exclude实用程序类型会得到never,因为所有文字类型都是从string

扩展而来的我已经看过其他问题,比如我如何从联合类型中删除更宽的类型而不删除TypeScript中的子类型?但由于他们的意图不一定与先前建立的联盟有关,因此没有一个答案满足我的需求

这是可能的吗?

您需要使用分配条件类型

type Union = 'a' | 'b' | string & {}
type GetLiteral<Type extends string | number, Value> =
Value extends Type
? (Type extends Value
? never
: Value)
: never
type ObtainLiterals<T> = T extends infer R ? GetLiteral<string, R> : never
// 'a' | 'b'
type Test = ObtainLiterals<Union>

游乐场

GetLiteral期望一个与Type相对应的联合类型和一个与Value泛型相对应的值。

ObtainLiterals-分配联合。这意味着用GetLiteral调用联合中的每个元素,最后产生'a'|'b'|nevernever总是被从联合中移除。

最新更新