TypeScript-字符串文字类型不能分配给类型参数扩展字符串文字类型

时间:2018-11-30 00:28:39

标签: typescript

我有一些这样的代码:

type FooType = 'Bar';

abstract class Meow<T extends FooType> {
  baz: T = 'Bar';
}

这将显示错误Type '"Bar"' is not assignable to type 'T'.

我不明白此错误。如果baz的类型为T,是否不应该允许FooType中的任何值?

除了子类可能需要的其他字符串文字之外,如何使类属性baz接受符合FooType的任何值?

1 个答案:

答案 0 :(得分:1)

通用类型约束指定类型参数需要满足的最小协定,但是T可能是具有比约束指定的更多必需属性的类型。这就是为什么打字稿通常不允许将文字分配给具有通用类型的任何内容。

考虑以下代码:

type FooType = 'Bar';

class Meow<T extends FooType> {
  baz: T = 'Bar';
}

let m = new Meow<'Bar' & { extra: number }>()
m.baz.extra // why is extra not assigned as it's type suggests it should be ?

对于字符串文字类型,我同意上面的示例可能看起来有些虚构,但是在类型系统下是可能的。我相信有人建议无论如何都可以使它正常工作,但是我不确定是否会实施。

要绕过此检查,最简单的解决方案是使用类型断言:

class Meow<T extends FooType> {
  baz: T = 'Bar' as T;
}