[Typescript] Medium 152. IsFixedStringLiteralType
ometimes you may want to determine whether a string literal is a definite type. For example, when you want to check whether the type specified as a class identifier is a fixed string literal type.
type Action<ID extends string> = { readonly id: ID };
Since it must be fixed, the following types must be determined as false.
- never type
- Union of string literal types
- Template literal types with embedded string, number, bigint, boolean
Determine whether the given type S is a definite string literal type.
Answer:
type IsFixedNonNumericString<S> = S extends ''
? true
: S extends `${infer C}${infer T}`
? '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' extends C
? false
: IsFixedNonNumericString<T>
: false;
type IsFixedStringLiteralType<S extends string, T = S> = [S] extends [never]
? false
: S extends unknown
? [T] extends [S]
? IsFixedNonNumericString<S>
: false
: false;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type testcase =
| Expect<Equal<IsFixedStringLiteralType<'ABC'>, true>>
| Expect<Equal<IsFixedStringLiteralType<string>, false>>
| Expect<Equal<IsFixedStringLiteralType<'ABC' | 'DEF'>, false>>
| Expect<Equal<IsFixedStringLiteralType<never>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${string}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${string & {}}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${number}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${bigint}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${boolean}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${true}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${false}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${null}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${undefined}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${string}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${string & {}}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${number}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${bigint}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${boolean}`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${true}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${false}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${null}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${undefined}`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${string}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${string & {}}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${number}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${bigint}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${boolean}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`${true}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${false}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${null}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`${undefined}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${string}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${string & {}}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${number}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${bigint}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${boolean}DEF`>, false>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${true}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${false}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${null}DEF`>, true>>
| Expect<Equal<IsFixedStringLiteralType<`ABC${undefined}DEF`>, true>>
| true
分类:
TypeScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-05-14 [Typescript] Dynamic types: Use TypeScript's Mapped Types and Template Literal Types Together
2020-05-14 [Mise] Focus in input field on page load with `x-init` in Alpine JS
2020-05-14 [Mise] Focus an input field on button click with `x-ref` and the `$refs` property in Alpine JS
2020-05-14 [Mise] Keep a DOM input and state value in sync with the `x-model` directive in Alpine JS
2020-05-14 [Mise] Control enter and leave transitions with the `x-show.transition` modifier in Alpine JS
2020-05-14 [Mise] Iterate through data with the `x-for` attribute in Alpine JS
2020-05-14 [Mise] Toggle visibility and styles based on state with `x-show` and `x-bind` in Alpine JS