我有以下代码:
type Id = string | number;
type ObjectId<T extends Id> = {
id: T;
};
type ValidObjectId = ObjectId<string> | ObjectId<number>
type ReverseId<T extends ValidObjectId> = T['id'] extends number ? string : number;
function encodeObjectId<T extends ObjectId<number>>(
obj: T
): ReverseId<T> {
const id = obj.id;
// Why does the following does not accept a string type?
// As it's the reverse of type number, because of the `ReverseId` type, it should be working.
return id.toString();
}
其中具有类型ReverseId
,该类型将转换id
属性的类型。例如,如果给定的对象id
属性具有number
类型,它将返回string
;并且如果给定对象的id
属性具有string
类型,则将返回number
类型。
这确实有效:
type Id = string | number;
type ObjectId<T extends Id> = {
id: T;
};
type ValidObjectId = ObjectId<string> | ObjectId<number>
type ReverseId<T extends ValidObjectId> = T['id'] extends number ? string : number;
// The `t` constant has a `number` type, which is the "reverse" of the `string`
// type, used in the given `ObjectId`.
const t: ReverseId<ObjectId<string>> = 1;
问题是:当ObjectId
来自泛型时,如我们在第一个示例中的encodeObjectId
函数中看到的那样,该类型不起作用。
是否可以使用条件类型解决此问题?