+-
如何在Typescript中正式创建一个超集子集的类型?

我有一个通用函数,它应该把一个给定类型的内容广播给任何愿意接收它的人。

比如说

function broadcast(J:Record<string,unknown>){...}

但当我将一个特定的类型应用于该函数时,我得到了一个错误,如

interface foo
{
   thing: string;
}

const a:foo={thing:'wow'};

broadcast(a); // error that I am not using a specific type but broadcast doesn't care.

我想出了一个办法,我可以像这样解包类型。

broadcast((a as unknown) as Record<string,unknown>) 

但我认为有一个更好的方法。

1
投票

下面的应该是工作,而不是 unknown记录一个类型为 T. 而且你甚至不需要一个 interface foo.

function broadcast<T>(J : Record<string,T>){
    console.log(J)
}

const a = {thing:'wow'};

broadcast<string>(a); 
0
投票

在你的例子中,你实际上并不需要一个真正的 foo 接口,因为它没有产生任何价值,无法帮助你保持代码的类型安全。

你的代码的核心问题是使用了类型的 unknown任何东西都可以分配给未知的东西,但未知的东西不能分配给任何东西,只能分配给自己。

这就是为什么你的 foo 接口类型变量 a 不能被分配到一个期望为 Record<string, unknown>.

替换为: Record<string, any> 会让typecript再次快乐起来。

然而,正如我前面所说的,这个额外的接口卫士 foo 不产生任何价值,所以你可以考虑删除它。