TypeScript类属性查找方法类型推断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeScript类属性查找方法类型推断相关的知识,希望对你有一定的参考价值。

我正在努力获取类型推断以用于类属性查找。

我想要的是:

class Family <T extends { [name: string]: Animal }> {
  public members: T

  public lookup <K extends keyof T>(name: K): T[K] {
    return this.members[name]
  }
}

class Animal {}
class Cat extends Animal {}
class Dog extends Animal {}

const cat = new Cat
const dog = new Dog

const foo = new Family
foo.members = { kitty: cat, bob: dog }
const result1 = foo.lookup('missing') // I want this to fail for missing key. It doesn't.
const result2 = foo.lookup('kitty') // I want this has inferred type Cat. It doesn't.

我相信上面是可以实现的,因为我得到的功能版本如下:>

function lookup <O, K extends keyof O> (obj: O, key: K): O[K] {
  return obj[key]
}

const o = { a:1, b: 'text'}
const r = lookup(o, 'a') // correctly inferred type number
const r2 = lookup(o, 'b') // correctly inferred type string

任何帮助或指南,我们将不胜感激。提前致谢。

我正在努力获取类型推断以用于类属性查找。我想要的是:类Family {公共成员:T公共查询

答案

[通常在声明变量时推断变量的类型,并且变量通常在更改后不会更改(因此,foo键入为Family<{ [name: string]: Animal; >,因为在初始化时没有其他可用信息)]

如果可以将member传递给构造函数,则根据将按预期工作的参数来推断T

class Family <T extends { [name: string]: Animal }> {
  constructor(public members: T) { }

  public lookup <K extends keyof T>(name: K): T[K] {
    return this.members[name]
  }
}

const result1 = foo.lookup('missing') // err
const result2 = foo.lookup('kitty') // cat

以上是关于TypeScript类属性查找方法类型推断的主要内容,如果未能解决你的问题,请参考以下文章

Typescript编译器无法从Promise resolve调用中推断类型

Typescript:使用装饰器时的类型推断

为啥 TypeScript 中的方法链接会导致泛型类型推断失败?

TypeScript:推断嵌套联合类型的类型

TypeScript 学习笔记 — 类型推断和类型保护

TypeScript 中泛型类型的子类型推断