具有泛型和对象的TypeScript条件类型

时间:2019-10-23 23:16:57

标签: typescript

我有以下代码:

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();
}

Playground link.

其中具有类型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;

Playground link.

问题是:当ObjectId来自泛型时,如我们在第一个示例中的encodeObjectId函数中看到的那样,该类型不起作用。

是否可以使用条件类型解决此问题?

0 个答案:

没有答案
相关问题