我正在研究一个带参数并返回它的函数,param是一个对象映射,问题是如何使用param和返回值使智能工作,这里有一个图像Preview Gif Image解释什么我想要。
感谢。
// object
interface P {
id?: number;
name?: string;
desc?: string;
}
// params
interface Params<T> {
[key: string]: P
}
// function
function create<T>(params: T): T{
return params
}
var s = create({
item: {
id: 1,
name:'name',
}
})
答案 0 :(得分:0)
你的动画GIF中的一切看起来都很完美。如果在没有明确输入的情况下使用,创建函数会将无论填入其中,只要它符合其功能签名。
function create<T>(params: T): T;
此处 T 是任意的,隐式类型系统将 s 与您放入create的对象文字的结构相匹配。这就是您可以在 s 上访问 .item 的原因,但是当您尝试 s [“foo”]。id 时,它将无效。
function create<T>(params: Params<T>): Params<T>;
这仍然按预期工作。参数 params 现在是索引签名,以及返回类型。您调用create的方式,外部对象文字足以满足索引签名,并且包含的结构与 P 匹配。现在,当您尝试 s.item 时,它将无效,因为您的界面参数中没有明确指定的属性项。但如果您尝试 s [“foo”]。id ,您会看到它有效。
请注意,这只是关于类型安全,这意味着:即使编译器说它没问题,在运行时没有“foo”时你也无法访问s [“foo”]。id 强>
了解TypeScript中 variable.some 和变量[“some”] 的区别非常重要。第一个需要变量的类型才能显示某些。后者要么要么某些要么具有索引签名。
您的示例很奇怪,因为您的界面 Params 属于通用类型,但通用 T 根本不涉及。因此,如果您使用上述第二个签名,则创建本身不是通用的,而是严格键入 Params ,因此 P 。