- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一种仅匹配标题大小写字符串的模板文字类型。我想我会首先使用 Uppercase<>
创建一个单词匹配器:
const uppercaseWord: Uppercase<string> = 'U';
但它似乎也匹配小写字母:
const uppercaseWord: Uppercase<string> = 'u';
这个不会扔。
我试过参数化它:
type SingleUpperCase<Str extends string> = `${Uppercase<Str>}`;
const upperCaseWord: SingleUpperCase = 'U';
但是无法推断类型参数。它通过显式传递字符串文字来工作:
type SingleUpperCase<Str extends string> = `${Uppercase<Str>}`;
const upperCaseWord: SingleUpperCase<'u'> = 'U';
它有效,但我需要更通用的东西。匹配任何大写字符串的东西。如果我再次尝试通过 string
作为类型参数,错误已解决,但小写字母可以赋值而不会出错:
type SingleUpperCase<Str extends string> = `${Uppercase<Str>}`;
const upperCaseWord: SingleUpperCase<string> = 'u'; // no error
我想知道这是否可能,因为它需要来自编译器的类似正则表达式的字符串匹配。
最佳答案
旁白:我不确定您对“标题大小写”有什么规则;我不知道"HTML String"
是否在标题大小写中。对于接下来的内容,我假设您只需要确保字符串的第一个字符和每个空格之后的第一个字符 (" ")
不是小写。这意味着 "HTML String"
很好。如果您有不同的规则,您可以调整下面答案中的代码。
TypeScript 中没有表示标题大小写的特定类型 string
秒。 Template literal types不要把这个给你;同时 Uppercase<string>
和 Capitalize<string>
从 TypeScript 4.8 开始,它们现在是自己的类型,在 microsoft/TypeScript#47050 中实现, 他们不会强制处理间距要求。
对于真正的标题案例 string
正如您所说,您需要输入类似正则表达式验证的内容 string
类型。 microsoft/TypeScript#41160 上有一个 Unresolved 问题询问此类经正则表达式验证的类型的用例;如果下面的解决方案不能满足您的需求,您可能想就您的用例的问题发表评论,为什么它很有吸引力,以及为什么替代解决方案不够用。
虽然这里没有特定的类型,但您可以编写 recursive模板文字类型 TitleCase<T>
可以用作 T
上的约束 .意思是T extends TitleCase<T>
当且仅当 T
是标题大小写的字符串。
然后,为了避免人们不得不用一些通用类型来注释他们的字符串,你会写一个像asTitleCase()
这样的辅助函数。它只返回其输入,但如果您传入错误的字符串,则会产生编译器错误。
因此,虽然您的理想解决方案如下所示:
/* THIS IS NOT POSSIBLE
const okay: TitleCase = "This Is Fine"; // okay
const error: TitleCase = "This is not fine"; // error
const alsoError: TitleCase = String(Math.random()); // error
*/
可实现的解决方案如下所示:
const okay = asTitleCase("This Is Fine"); // no error
const error = asTitleCase("This is not fine"); // error!
// ---------------------> ~~~~~~~~~~~~~~~~~~
// Argument of type '"This is not fine"' is not assignable to
// parameter of type '"This Is Not Fine"'.
const alsoError = asTitleCase(String(Math.random())); // error!
// Argument of type 'string' is not assignable to parameter of type
// '"Please Use a Title Cased String Literal Here, Thx"'
同样,这是可实现的,而不是理想的。所有使用标题大小写的字符串类型都需要获得一个额外的泛型类型参数。
请注意,您可能不需要实际编写 asTitleCase(...)
除非你想在声明中看到错误。大概你有一些关心标题大小写的函数(比如 lookupBookTitle()
)。如果是这样,您只需使那个 函数通用并在那里强制执行约束。所以而不是 const str = asTitleCase("XXX"); lookupBookTitle(str);
, 你只要写 const str = "XXX"; lookupBookTitle(str);
唯一的区别是错误出现的位置。
此外,在类似 lookupBookTitle()
的实现中,您可能应该将输入扩大到 string
并将其视为已经过验证。尽管T extends TitleCase<T>
具有对调用者强制约束的效果,编译器在 T
时将无法遵循逻辑是未指定的泛型类型参数:
// callers see a function that constrains title to TitleCase
function lookupBookTitle<T extends string>(title: VerifyTitleCase<T>): Book;
// implementer just uses string
function lookupBookTitle(title: string) {
const book = db.lookupByTitle(title);
if (!book) throw new Error("NO BOOK");
return book;
}
无论如何,这是实现:
type TitleCase<T extends string, D extends string = " "> =
string extends T ? never :
T extends `${infer F}${D}${infer R}` ?
`${Capitalize<F>}${D}${TitleCase<R, D>}` : Capitalize<T>;
类型TitleCase<T, D>
拆分字符串 T
在分隔符 D
, 并将每个部分大写(第一个字符大写)。所以它把一个字符串变成了它自己的标题大写版本:
type X = TitleCase<"the quick brown fox jumps over the lazy dog.">
// type X = "The Quick Brown Fox Jumps Over The Lazy Dog."
然后我们可以写一个VerifyTitleCase<T>
检查是否 T extends TitleCase<T>
的类型.如果是这样,它解析为 T
.如果不是,它会解析为 TitleCase<T>
,或者一些硬编码的错误字符串,希望能让用户知道哪里出了问题。 (根据 microsoft/TypeScript#23689 中的要求,TypeScript 中没有“throw
类型”或“Invalid
类型”;因此使用硬编码错误字符串文字是一种解决方法):
type VerifyTitleCase<T extends string> = T extends TitleCase<T> ? T :
TitleCase<T> extends never ? "Please Use a Title Cased String Literal Here, Thx" :
TitleCase<T>
最后,辅助函数:
const asTitleCase = <T extends string>(s: VerifyTitleCase<T>) => s;
关于string - 匹配标题大小写的 TypeScript 模板文字类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67299745/
namespace std { template <> class hash{ public : size_t operator()( cons
我正在构建一个 Javascript 交互性有限的 Django 应用程序,并且正在研究如何将 Vue 模板与 Django 模板合并以实现相同的内容。 想象一个无限滚动的页面,其中 SEO 非常重要
我需要一个由游戏逻辑组成的外部类,调用 LitElement 组件,并向其传递一个 html 模板文字,该组件将使用该文字来更新其自己的 html 模板文字的一部分。 在下面的代码中,您将看到组件的一
很简单,我不想在 html 文件中定义所有 Handlebars 模板 我试过了 但这并没有奏效。我是否可以不以编程方式定义模板,甚至只是加载 Handlebars 文件,以便我可以重用,而且我觉得
在此代码中,j 正确地成为对象:j.name、j.addr、j.city、j.state 和 j.zip。但是,成功函数有一个 JavaScript 错误 .tmpl() 不是函数。 {{t
Django模板不会?点进来,总结了模板语法传值取值、过滤器和自定义过滤器、模板标签的分类、中间件403报错如何解决、如何继承模板~👆 Django 模板 模板传值取值 后端传值 键值对形式:{‘n
哈喽大家好,我是鹿 九 丸 \color{red}{鹿九丸}鹿九丸,今天给大家带来的是C++模板。 如果大家在看我的博客的过程中或者学习的过程中以及在学习方向上有什么问题或者想跟我交流的话可以加我的企
我正在用 PHP 编写一个简单的模板层,但我遇到了一些困难。目前它是这样工作的: 首先,我使用 fetch_template 从数据库中加载模板内容 - 这可行(如果您有兴趣,我会在启动时收集所有模板
我正在制作有关模板的 Django 教程。我目前处于此代码: from django.template import Template, Context >>> person = {'name': '
我正在使用 Jquery 模板来显示传入的 JSON 数据我想将模板加载到可缓存的外部文件中。我该怎么做? 更新 http://encosia.com/2010/12/02/jquery-templa
这是我的观点.py: from django.http import HttpResponse from django.template.loader import get_template from
我试图说服一位同事在项目的前端使用 Mustache/Hogan,我提出了以下建议: 有一个 templates.js 文件,大致如下所示: var tpl_alert = '{{msg}}'; va
我想创建一个通用的数组函数。在我的 API 中,我有一个通用容器,我需要将其转换为正确的类,但我想让它通用 template void UT::printArray(CCArray* arr, T t
有谁知道是否有办法在 Genshi 中创建 javascript 模板?我的意思是,我需要一个 .js 文件,可以在其中使用 等指令。等等。 有什么想法吗?谢谢! 最佳答案 你可以直接在html中这
我想知道是否可以设置某种 HTML 模板系统,基本上我有 3 个不同的文件: - header.html - footer.html - landing.html(landing.html 是包含页面
我正在尝试构建以下 HTML 模板: 这很简单,如果我使用红色容器 1-4,语法如下: 1 2 3 4 5 6 7 8 9 https://jsfi
#include "boost/numeric/ublas/matrix.hpp" using namespace boost::numeric::ublas; template class Lay
我在一个类中有一个函数,它传递了一个函数及其参数,然后将它们绑定(bind)到一个函数调用中并调用该函数等。 这已经被快速组合在一起以测试我知道代码不是很好的概念。 class Profiling {
是否有一个 c++ 结构或模板(在任何库中)允许我在十进制和任何其他基数之间进行转换(很像 bitset 可以做的)? 最佳答案 是的,你可以使用unsigned int: unsigned int
来自其他编程语言,许多像我一样的人会感到惊讶。我有一个简单的问题。我有一个列表——比如说,用户。我想遍历用户并显示一些信息。非常简单,直到我被这个难住了: 使用一个 eex 模板,我试图这样做:
我是一名优秀的程序员,十分优秀!