+-

我有一个通用函数,它应该把一个给定类型的内容广播给任何愿意接收它的人。
比如说
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 不产生任何价值,所以你可以考虑删除它。