微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

接口不能在条件类型中扩展映射类型

如何解决接口不能在条件类型中扩展映射类型

在调试我的程序时,我注意到以下示例产生了编译错误 (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 中的类型和接口之间存在一些差异,我怀疑无法在接口中使用映射类型这一事实可能解释了这种行为。我无法完全理解为什么这种地图类型限制会导致 Quxnever,即使是这种情况。

此外,interface Foobar extends Record<string,unkNown> { key: string };一个有效的接口定义,这让我更加困惑。

谁能帮我理解这个错误

解决方法

这是因为类型别名具有隐式索引签名,而接口没有。

如果您将索引签名添加到界面 - Qux 将导致 any

interface Bar { 
    key: string;
    [p: string]: string;
};

Playground

更多信息here

此行为目前是设计使然。因为接口可以通过附加声明进行扩充,但类型别名不能,所以为类型别名推断隐式索引签名比为接口推断隐式索引签名“更安全”(在那个上面加引号)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。