如何解决接口不能在条件类型中扩展映射类型
在调试我的程序时,我注意到以下示例产生了编译错误 (playground)。
type Foo = {key: string};
interface Bar {key: string};
type Baz = Foo extends Record<string,unkNown>? any: never;
type Qux = Bar extends Record<string,unkNown>? any: never;
const baz: Baz = 0;
const qux: Qux = 0; // Type 'number' is not assignable to type 'never'.
似乎接口不能扩展 Record<string,unkNown>
而类型可以。我知道 TypeScript 中的类型和接口之间存在一些差异,我怀疑无法在接口中使用映射类型这一事实可能解释了这种行为。我无法完全理解为什么这种地图类型限制会导致 Qux
为 never
,即使是这种情况。
此外,interface Foobar extends Record<string,unkNown> { key: string };
是一个有效的接口定义,这让我更加困惑。
谁能帮我理解这个错误?
解决方法
这是因为类型别名具有隐式索引签名,而接口没有。
如果您将索引签名添加到界面 - Qux
将导致 any
:
interface Bar {
key: string;
[p: string]: string;
};
更多信息here:
此行为目前是设计使然。因为接口可以通过附加声明进行扩充,但类型别名不能,所以为类型别名推断隐式索引签名比为接口推断隐式索引签名“更安全”(在那个上面加引号)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。