Typescript惰性类型解析(在声明任何类型后解析特定类型)

Typescript惰性类型解析(在声明任何类型后解析特定类型),typescript,Typescript,在这种情况下如何进行类型解析 我有以下接口: interface Item { id: number; } interface TestSettings<T, IdT> { setId: (t: T) => IdT; getId: (t: IdT) => void; } 接口项{ id:编号; } 接口测试设置{ setId:(t:t)=>IdT; getId:(t:IdT)=>void; } 和以下代码: let settings: Tes

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

我有以下接口:

interface Item {
    id: number;
}

interface TestSettings<T, IdT> {
    setId: (t: T) => IdT;
    getId: (t: IdT) => void;
}
接口项{
id:编号;
}
接口测试设置{
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'? 
};
let设置:TestSettings={
setId:x=>x.id,
getId:x=>x
这里的“x”类型是“any”

您使用
TestSettings
明确要求它是
any

修理 但是有可能有“number”类型吗

当然可以:

let settings: TestSettings<Item, number> = {
    setId: x => x.id,
    getId: x => x
};
let设置:TestSettings={
setId:x=>x.id,
getId:x=>x
};
这里的“x”类型是“any”

您使用
TestSettings
明确要求它是
any

修理 但是有可能有“number”类型吗

当然可以:

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

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

interface TestSettings<T extends { id: any }> {
    setId: (t: T) => T['id'];
    getId: (t: T['id']) => void;
}
接口测试设置{
setId:(t:t)=>t['id'];
getId:(t:t['id'])=>void;
}
如果您需要推断,不幸的是TypeScript没有尝试。如果需要,您可以
TestSettings
,然后如果您声明
let settings:TestSettings
,它可能会执行您想要的操作。现在,您需要按照@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>
let设置={
setId:(x:Item)=>x.id,
getId:(x:number)=>{}
};//您必须真正指定这一点
声明函数doSomethingWithTestSettings(ts:TestSettings):void;
doSomethingWithTestSettings(设置);//推断为TestSettings

这对您来说可能更糟。因此,您可能需要显式地对其进行注释,抱歉。

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

interface TestSettings<T extends { id: any }> {
    setId: (t: T) => T['id'];
    getId: (t: T['id']) => void;
}
接口测试设置{
setId:(t:t)=>t['id'];
getId:(t:t['id'])=>void;
}
如果您需要推断,不幸的是TypeScript没有尝试。如果需要,您可以
TestSettings
,然后如果您声明
let settings:TestSettings
,它可能会执行您想要的操作。现在,您需要按照@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>
let设置={
setId:(x:Item)=>x.id,
getId:(x:number)=>{}
};//您必须真正指定这一点
声明函数doSomethingWithTestSettings(ts:TestSettings):void;
doSomethingWithTestSettings(设置);//推断为TestSettings

这对您来说可能更糟。因此,您可能需要显式注释它,抱歉。

当然我知道这种可能性,但希望在不显式表示数字的情况下进行类型定义。我知道在某些情况下是可能的。在声明'setId:x=>x.id'Typescri之后pt可以知道我们处理的是哪种类型当然我知道这种可能性,但我想在没有明确指示数字的情况下进行类型定义。我知道在某些情况下这是可能的。在这种情况下不是,但它可以,或者你不同意?在声明'setId:x=>x.id'后,Typescript可以知道我们处理的是哪种类型