繁体   English   中英

使用`${any}${any}`了解 TypeScript 模板文字类型

[英]Understanding TypeScript template literal type with `${any}${any}`

有人可以解释这是为什么:

type NotEmpty<T extends string> = T extends `${any}${any}` ? T : never;

declare function something<T extends string>(x: NotEmpty<T>): void;

something("hello")
something(""); // Argument of type 'string' is not assignable to parameter of type 'never'.(2345)

实现了该类型的明显目标,但这并没有:

type NotEmpty<T extends string> = T extends `${string}${string}` ? T : never;

declare function something<T extends string>(x: NotEmpty<T>): void;

something("hello")
something(""); // okay

这也没有:

type NotEmpty<T extends string> = T extends `${any}` ? T : never;

declare function something<T extends string>(x: NotEmpty<T>): void;

something("hello")
something(""); // okay

老实说,我很惊讶第一个有效:直觉上,你会认为'' extends string extends any
¯\ (ツ)

这是一种工作类型,以防任何未来的人需要一种简单明了的工作类型。

type NonEmpty<T extends string> = '' extends T ? never : T;

但这感觉像是作弊,因为它明确使用空字符串并且没有回答您的问题。

但是,如果您使用infer扩展${any}${any}${string}${string} ,它们都会产生您的预期结果。

type NonEmpty<T extends string> = T extends `${infer First}${infer Rest}` ?
 First extends string ? Rest extends string ? T : never : never : never;

这只会增加我的困惑。 我知道在模板文字方面有一些类型的简化 我认为获得答案的最佳途径是在 Typescript 存储库上打开一个问题,并希望 Anders(Typescript 家伙)或团队中的某个人澄清。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM