打字稿懒惰类型解析(声明任何后解析特定类型)

时间:2017-07-24 18:26:29

标签: typescript

如何在这种情况下进行类型解析?

我有以下界面:

interface Item {
    id: number;
}

interface TestSettings<T, IdT> {
    setId: (t: T) => IdT;
    getId: (t: IdT) => void;
}

以下代码:

let settings: TestSettings<Item, any> = {
    setId: x => x.id,
    getId: x => x     <--- Here 'x' type is 'any' but it is possible to have type 'number'? 
};

在Typescript中是否有可能在没有明确设置接口声明的情况下获得这样的类型检查?

2 个答案:

答案 0 :(得分:1)

如果您知道类型T始终具有相应类型的id属性,则可以像这样定义TestSettings

interface TestSettings<T extends { id: any }> {
    setId: (t: T) => T['id'];
    getId: (t: T['id']) => void;
}

如果您需要推理,遗憾的是TypeScript不会尝试infer optional generic types。如果确实如此,您将能够TestSettings<T, IdT = any>,然后如果您声明let settings: TestSettings<Item>,它可能会执行您想要的操作。就像现在一样,你需要像@basarat那样指定整个事物,或者你可以试着让它推断出整个事情:

let settings = {
    setId: (x:Item) => x.id,
    getId: (x:number) => {}
}; // you have to really specify this
declare function doSomethingWithTestSettings<T, IdT>(ts: TestSettings<T, IdT>): void;
doSomethingWithTestSettings(settings); //infers as TestSettings<Item, number>

对你来说可能更糟糕。所以,你可能只需要明确地注释它,抱歉。

答案 1 :(得分:0)

  

这里&#39; x&#39;类型是&#39;任何&#39;

您明确要求anyTestSettings<Item, any>

修复

  

但是可以输入&#39;数字&#39;?

当然:

let settings: TestSettings<Item, number> = {
    setId: x => x.id,
    getId: x => x
};