在使用typescript时,如何将Map类型约束为仅接受字符串键?

eagi6jfj  于 7个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(78)

我在Typescript的文档中读到,我可以创建一个Map类型,可以用来将可能的键约束为特定类型的键:

type OptionsFlags<Type> = {
  [K in keyof Type]: boolean;
};

字符串
但是如果我想让一个泛型类型作为一个只接受字符串的值:

type Key<K extends string> {
    key: K
}


那么这个就不起作用:

type OptionsFlags<Type> = {
  [K in keyof Type]: Key<K>;
};


因为

Type 'K' does not satisfy the constraint 'string'.
  Type 'keyof Type' is not assignable to type 'string'.
    Type 'string | number | symbol' is not assignable to type 'string'.
      Type 'number' is not assignable to type 'string'


似乎我必须约束Type中的键,但我如何做到这一点呢?

35g0bw71

35g0bw711#

你想要这样的东西:

type OptionsFlags<T> = {
  [K in keyof T]: T[K];
};

字符串

示例用法(成功):

type Element = {
  id: string;
  label: string;
};

const data: OptionsFlags<Element> = { id: "username", label: "Username" };

> data
{ id: 'username', label: 'Username' }

示例用法(失败):

type Element = {
  id: string;
  label: string;
};

> const data: OptionsFlags<Element> = { name: "username" };
<repl>.ts:11:39 - error TS2322: Type '{ name: string; }' is not assignable to type 'OptionsFlags<Element>'.
  Object literal may only specify known properties, and 'name' does not exist in type 'OptionsFlags<Element>'.

11 const data: OptionsFlags<Element> = { name: "username" };
                                         ~~~~~~~~~~~~~~~~

相关问题