我正在使用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'|never
。never
总是被从联合中移除。