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可以知道我们处理的是哪种类型