EndsWith
挑战
实现 EndsWith<T, U>
,它接受两个字符串类型,并返回 T
是否以 U
结尾:
type R0 = EndsWith<"abc", "bc">; // true
type R1 = EndsWith<"abc", "abc">; // true
type R2 = EndsWith<"abc", "d">; // false
解答
这个挑战属于中等难度,但我认为它不应该出现在这里。它更像一个简单难度的而不是中等 难度的。但是,我又有什么资格去评判。
我们需要检查字符串是否以特定的字符串结束。很明显模板字面量类型会很有用。
让我们从模板字面量类型开始,它可以包含任何字符串。目前,我们不关心内容,所以我们
在这里使用 any
类型:
type EndsWith<T extends string, U extends string> = T extends `${any}`
? never
: never;
在这个语句中,我们说“嘿,编译器,检查字面量类型 T
是否从 any
类型扩展的”。结
果为真,它是扩展的。
现在,让我们添加一个需要检查的子字符串。我们通过类型参数 U
传递子字符串,我们
需要检查它是否在字符串的结尾。就这样:
type EndsWith<T extends string, U extends string> = T extends `${any}${U}`
? never
: never;
通过使用这样的结构,我们检查字符串是否从 any
扩展,以 U
结尾。简单,剩下的就
是根据结果返回布尔类型。
type EndsWith<T extends string, U extends string> = T extends `${any}${U}`
? true
: false;
评论