为何TypeScript中Partial与extends未按预期工作?
为什么这段TypeScript代码无法正常运行?
先看报错的代码:
type FooData = { p: string; } const foo = <T extends FooData>() => { const not_working: Partial<T> = { p: "foo" }; // 此处报错:Type '{ p: "foo"; }' is not assignable to type 'Partial<T>'.(2322) }
你以为T extends FooData能保证T的p是string类型,所以{ p: "foo" }应该能赋值给Partial<T>,但问题出在泛型T可以是FooData的更具体子类型。
举个实际的例子,如果调用foo时指定T为一个更严格的类型:
type StrictFoo = { p: "bar" }; foo<StrictFoo>();
这时候Partial<T>的类型会变成{ p?: "bar" | undefined },而你赋值的{ p: "foo" }里的p是字符串字面量"foo",和"bar"类型完全不兼容。TypeScript编译器必须确保代码在所有符合T extends FooData的场景下都合法,显然存在不合法的情况,所以报错。
如果要让代码合法,有两种常见方式:
- 把
Partial<T>改成Partial<FooData>,直接约束为基础类型的部分类型 - 使用类型断言
const not_working = { p: "foo" } as Partial<T>,但要注意这种方式会跳过类型检查,若T的p是更窄的类型,可能带来运行时风险
内容的提问来源于stack exchange,提问作者ilbrando
相关产品推荐
相关产品推荐

