【问题标题】:Argument of function is a property that exists in a type of Typescript函数参数是 Typescript 类型中存在的属性
【发布时间】:2019-10-31 23:05:05
【问题描述】:

我想编写一个函数,它返回一个类型上存在的单个属性:

type CustomType = {
    property1: boolean;
    property2: numeric;
};

private getData(obj): CustomType {
    // do stuff
    return dataObj;
}

private getBooleanValue(obj, key): boolean {
    const value = this.getData(obj)[key];
    // do stuff
    return value;
}

我想对 getBooleanValue 的键进行限制,该键是 CustomType 的一部分 - 例如:

getBooleanValue(obj, "property1") // OK
getBooleanValue(obj, "property2") // ERROR, TypeScript won't allow this

【问题讨论】:

  • 为什么不使用key: keyof TypeB here
  • 这段代码似乎不是minimal reproducible example,因为它引用了不存在的类型和值。考虑编辑代码,以便有人可以将其放入 IDE 中,唯一的问题是您要询问的问题。祝你好运!
  • @ford04 - 是的!你是对的:) 谢谢你的帮助,我将编辑我在下面制作的解决方案。
  • @jcalz - 修正了解释

标签: javascript typescript types


【解决方案1】:

似乎这种方法可行,但似乎不是最好的解决方案:

type FilterFlags<Base, Condition> = {
    [Key in keyof Base]: Base[Key] extends Condition ? Key : never;
};

type AllowedNames<Base, Condition> = FilterFlags<Base, Condition>[keyof Base];


private getValue(
    obj, 
    key: keyof AllowedNames<CustomType, boolean>
): boolean {
    const value = this.getData(obj)[key];
    // do stuff
    return value;
}

编辑:我找到了一篇关于过滤类型(条件类型)中道具的精彩文章: https://medium.com/dailyjs/typescript-create-a-condition-based-subset-types-9d902cea5b8c

【讨论】:

  • 不应该只是key: AllowedNames&lt;CustomType, boolean&gt; 而您不需要SubTypeBooleans 定义吗?
  • @jcalz 你是完全正确的 :) 修复了解决方案!
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 2020-07-26
  • 2019-03-31
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多