将接口限制为联合类型中的特定键
Posted
技术标签:
【中文标题】将接口限制为联合类型中的特定键【英文标题】:Restricting an interface to specific keys from a union type 【发布时间】:2021-04-13 04:06:51 【问题描述】:我有一个联合类型,列出了一些允许的键:
type AllowedKeys = "a" | "b";
在其他地方,我正在声明一个接口,我想将此接口限制为允许的键:
interface Interface
a: Something; // This is fine
c: SomethingElse; // I want this to throw an error
我如何编写这个来强制接口尊重允许的键?
【问题讨论】:
【参考方案1】:interface 无法做到这一点,因为
这是因为 TypeScript 中的接口是开放式的。这是 TypeScript 的一个重要原则,它允许您使用接口模仿 javascript 的可扩展性。
基本上,您可以随时向界面添加新属性。
你可以试试
type AllowedTypes =
"a" : string;
"b": number ;
type AllowedKeys = keyof AllowedTypes;
【讨论】:
有趣,谢谢。这可以用对象类型来代替吗? 是的!以这种方式思考实际上确实可以让我实现我需要做的事情,谢谢!我现在让问题打开,看看是否有人提出了不同的方法,但这有效。 很高兴它能帮到你【参考方案2】:如果您不需要将其作为接口并且可以使用 type 代替,请考虑这样做:
type AllowedKeys = "a" | "b";
export type TestType =
[key in AllowedKeys]: Something;
;
它会强制你在你的类型中使用这两个键 - 不确定这是否是你想要的。例如:
这会抛出一个错误:
const a: TestType =
a: 'asd',
b: 'asd',
c: 'asd'
这很好:
const a: TestType =
a: 'asd',
b: 'asd',
但这也会引发错误:
const a: TestType =
a: 'asd',
如果您不关心是否使用了所有允许的键,只需在类型声明中使用 ?
:
export type TestType =
[key in AllowedKeys]?: string;
;
【讨论】:
我确实尝试过这条路线,如果每个键都具有相同的类型,它就可以工作。就我而言,我需要每个键都有不同的特定类型 有道理,那么此响应不适合您的情况:)以上是关于将接口限制为联合类型中的特定键的主要内容,如果未能解决你的问题,请参考以下文章
如何将子firebase数据库中的特定名称获取到recyclerview?
如何从 Typescript 中的常量定义字符串文字联合类型
我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?