英文:
Disallow alphanumeric characters in numeric template literal types
问题
interface Message{
Code: `SLA${number}`;
}
这个类型定义试图将字符串值限制为SLAXXX
的形式。
SLA123
和SLA01000
都是有效的值。
负号是数字的一部分,因此像SLA-102
或SLA0x10
这样的输入仍然会通过检查。
我们如何强制代码字段具有SLA前缀,后跟数字字符?
英文:
interface Message{
Code: `SLA${number}`;
}
The type definition attempts to constraint string values to the form of SLAXXX
.
With SLA123
and SLA01000
being valid values.
A negative sign is part of a number, thus input such as SLA-102
or SLA0x10
still pass the check.
How can we enforce the code field to have a prefix of SLA followed by only numeral characters?
答案1
得分: 1
以下是代码的翻译部分:
你可以使用一个辅助函数来完成这个操作:
type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type OnlyDigits<S> = S extends '' ? unknown : S extends `${Digit}${infer Tail}` ? OnlyDigits<Tail> : never;
type Code = `SLA${Digit}`;
function code<S extends string>(s: `SLA${S & OnlyDigits<S>}`): Code {
return s as Code;
}
const foo = code(`SLA0000011`);
const bar = code(`SLA000x011`); // KO
希望这对你有帮助。
英文:
You can do this with a helper function :
type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type OnlyDigits<S> = S extends '' ? unknown : S extends `${Digit}${infer Tail}` ? OnlyDigits<Tail> : never;
type Code = `SLA${Digit}`;
function code<S extends string>(s: `SLA${S & OnlyDigits<S>}`): Code {
return s as Code;
}
const foo = code(`SLA0000011`);
const bar = code(`SLA000x011`); // KO
The helper function here is required to infer the generic.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论