【问题标题】:Find object property by type按类型查找对象属性
【发布时间】:2019-03-13 23:17:42
【问题描述】:

我有类似的界面

interface A {
   a: string;
}

interface B {
   b: string;
}

export interface C {
   rnd: A;
   rnd2: B;
}

并且我想要像update<T>(setting: T) 这样的函数,它在对象中找到T 类型的属性,它实现interface C 并使用setting 更新找到的属性(如果已经存在)值。

有没有办法做到这一点?我试过迭代和typeof,但编译器返回This condition will always return 'false' since types 'T' and 'string' has no overlap

【问题讨论】:

  • 如果没有真正深入的知识很难证明是否定的,我有 JavaScript 但没有 TypeScript,所以:我非常非常怀疑这些信息在运行时是否可用。 TypeScript 的静态类型检查是在编译时完成的,它会发出 JavaScript。据我所知,它不会发出您需要执行此操作的更多元数据。
  • 现在,如果它们是类而不是接口,您可以使用instanceof。但是使用instanceof 通常表明您需要重新考虑自己在做什么。 :-)

标签: typescript


【解决方案1】:

一种可能的解决方案是传入密钥名称。您可以让编译器检查键名是否为C 的有效键,并且值参数与C 中指定的键的类型相同:

interface A { a: string; }

interface B { b: string; }

export interface C { rnd: A; rnd2: B;}

let allSettings: C = {} as C
function update<K extends keyof C>(key: K, setting: C[K]) {
    allSettings[key]  = setting;
}

update("rnd", { a: "" }) // ok
update("rnd", { b: "" }) // err
update("rnd3", { b: "" }) // err 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2014-04-27
    • 2011-08-20
    相关资源
    最近更新 更多