microsoft / microsoft/TypeScript

Type '`x.y.${Name}`' does not satisfy the constraint '`${string}.${Name}`'.(2344)

未关闭
#61,990 4 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看
Awaiting More Feedback Suggestion
主要语言
Go
星标
111k
派生
14.3k
平均合并
2 天 4 小时
30 天内合并 PR
132

描述

### 🔎 Search Terms

Template Literal Types, assignability, generics

### 🕗 Version & Regression Information

- Between versions 4.3.5 and 4.2.3 more cases like this started being supported ( `x.${Name}` became assignable to `${string}.${Name}` for example), however the `x.y.${Name}` case has not bees assignable in any version since template support was added up to and including current nightly ( 5.9.0-dev.20250702 )

### ⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.9.0-dev.20250702#code/PQKhCgAIUhhB7AtgBwJYBsCmkAurHYCGAzsZgE464AWhVAgpKsZCcagOYB2hARlrniQAFJgAeOTFwAmxAJSQAQgDooMACpCArmQA0kdinQBPSNMwAzVFyK5jyTAC41kAAY572APoBjaph8Aa0gAXkhyTABHLVQI+lJOHn5MTQAedX0AUTEHH0lpAD4Ablc1YHBxZHhKOwdwqJi4hO4+LDSvRnFJGRZFfUUC0NxyLUwi8HAPOoB3asDiAGVrHxTPBZ9yVGQcABYvAGZUgDlCAkguqVkDHE2uDkGwiOjYzHj2FuS0qEgf1zFlAAkAG8TgQAL6uXTfX7A4g3awcMGAkGnTAQ8DFCZTbAWQgYYjHVHnCSXFhw273IZPRqvZpJNrwVLQtz-YzI0FoyHM1yw+F3JHAjnozGTTyQLjwLgAcSkFFQPgA6nMWI8Gi83olWilGdzWcoAF5cn4woHkhFIw0YopAA

### 💻 Code

```ts
/**
* Compile time assert that A is assignable to (extends) B.
* To use, simply define a type:
* `type _check = requireAssignableTo;`
*/
export type requireAssignableTo<_A extends B, B> = true;

type worksSinceTypeScript4_3 = requireAssignableTo<
`x.${Name}`,
`${string}.${Name}`
>;

type fails = requireAssignableTo<
// Type '`x.y.${Name}`' does not satisfy the constraint '`${string}.${Name}`'.(2344)
`x.y.${Name}`,
`${string}.${Name}`
>;

type nonGenericWorks = requireAssignableTo<
`x.y.z`,
`${string}.z`
>;
```

### 🙁 Actual behavior

A compile error:

> Type '`x.y.${Name}`' does not satisfy the constraint '`${string}.${Name}`'.(2344)

### 🙂 Expected behavior

No compile error. The `.${Name}` portion of the type matches exactly, so this can be reduced to checking if `"x.y"` is assignable to `string` should be allowed.

### Additional information about the issue

I understand that in general not all cases like that are practical to support: perfect assignability checking of template strings is likely infeasible but I decided to report this case as I think this one suggest an algorithm that would be practical to implement and efficient: running a greedy algorithm to remove common constant substrings from the beginning and end of the string, including generic values, might be a viable approach, and would improve handling of this case.

贡献指南

打开贡献指南

调研方向

在链接的 TypeScript Playground 中重现报告的泛型模板字面量可赋值性案例,并将其与可正常工作的 `x.${Name}` 及非泛型示例进行比较。调查编译器对模板字面量可赋值性的检查,并验证断言 `x.y.${Name}` 能够编译,同时不会导致现有案例回归。

由索引模型根据 Issue 内容生成。

评估

技术栈
typescript
领域
compilers
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。