我有以下代码:

type Foo<T extends string = string> = `bar-${T}-foo`;

const v: Foo = 'bar-g-foo'

这就像预期的那样,但它不会迫使 struct .以下内容同样有效:

  const v: Foo = 'bar--foo'

我怎样才能强制使用T

推荐答案

这里的问题是check for an empty string.阅读更多关于这个问题的信息:How to write a string type that does not contain an empty string in TypeScript

根据上面的堆栈,您可以执行以下操作:

type Character = 'a' | 'b' | 'c' | ... ; // Here all possible 1 letter strings
type NonEmptyString = `${Character}${string}`;
type Foo<T extends string = NonEmptyString> = `bar-${T}-foo`;

const v: Foo = 'bar-a-foo' // ✔
const x: Foo = 'bar--foo' // ❌ Type '"bar--foo"' is not assignable to type

Playground link

Typescript相关问答推荐

替换类型脚本类型中的多个特定字符串

使用新控制流的FormArray内部的Angular FormGroup

类型脚本不会推断键的值类型

调用另一个函数的函数的Typescript类型,参数相同

TS 2339:属性切片不存在于类型DeliverableSignal产品[]上>'

更新:Typescript实用程序函数合并对象键路径

需要使用相同组件重新加载路由变更数据—React TSX

我应该使用什么类型的React表单onsubmit事件?

rxjs forkJoin在错误后不会停止后续请求

如何在TypeScrip中从字符串联合类型中省略%1值

如何将v-for中的迭代器编写为v-if中的字符串?

具有自引用属性的接口

返回嵌套props 的可变元组

如何通过属性名在两个泛型数组中找到匹配的对象?

扩展对象的此内容(&Q;)

无法缩小深度嵌套对象props 的范围

为什么类型脚本使用接口来声明函数?他的目的是什么.

为什么受歧视的unions 在一种情况下运作良好,但在另一种非常类似的情况下却不起作用?

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因

Typescript 确保通用对象不包含属性