![](/img/trans.png)
[英]Invalid type "any" of template literal expression in React 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.