如何使TypeScript Generics Type智能按预期工作

时间:2016-07-13 03:20:52

标签: typescript

我正在研究一个带参数并返回它的函数,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',         
    }
})


 

1 个答案:

答案 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