如何定义一个Map类型,根据typescript中的键对值进行约束?

hjqgdpho  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(106)

我有以下类型(简化为brewity):

type Wrapper<T extends string> = {
    value: T
}

type Mapping = {
    [T in string]: Wrapper<T>
}

我这样做的目的是限制TWrapper中的可能值,对于任何给定的键T。如果我这样做,我希望发生什么:

const mapping: Mapping = {
    "a": { value: "b" },
}

是有一个编译器错误,因为"b"是不能分配给"a",但由于某种原因,这编译。我做错了什么?

omqzjyyz

omqzjyyz1#

为了避免编译时错误,您应该使用as关键字创建一个具有所需约束的Map类型。
试试这个:

type ConstrainedMapping<T extends string> = {
  [K in T]: Wrapper<K>;
};

const mapping = {
  "a": { value: "b" },
} as ConstrainedMapping<keyof typeof mapping>;

是否也可以创建一个实用函数:

type ConstrainedMapping<T extends string> = {
  [K in T]: Wrapper<K>;
};

function map<T extends string>(mapping: ConstrainedMapping<T>): ConstrainedMapping<T> {
  return mapping;
}

// This won't compile!
const mapping = map({
  "a": { value: "b" },
});

相关问题