繁体   English   中英

如何使用带有TypeScript的keyof访问器定义返回类型?

[英]How to define return type using keyof accessor with TypeScript?

是否可以创建一个使用keyof访问对象属性并让TypeScript推断返回值的函数?

interface Example {
    name: string;
    handles: number;
}

function get(n: keyof Example) {
   const x: Example = {name: 'House', handles: 8};
   return x[n];
}

function put(value: string) {

}

put(get("name"));
// ^^^ Error: Argument of type 'string | number' is not assignable to parameter of type 'string'

TypeScript 所有允许的类型合并在一起,但是当使用值"name"调用函数时,不会推断类型为string

我可以通过强制类型解决问题。

put(get("name") as string);

有没有办法做到这一点而无需铸造?

当然,您只需要使get 通用 ,就不会返回所有可能的输出类型的并集:

function get<K extends keyof Example>(n: K) {
  const x: Example = { name: "House", handles: 8 };
  return x[n];
}

现在推断签名为:

// function get<K extends "name" | "handles">(n: K): Example[K]

返回类型Example[K]是一个查找类型,表示当您使用键K索引到Example时所获得的类型。

调用它时,如果可以将K推断为字符串文字类型:

get("name"); // function get<"name">(n: "name"): string

并且Example["name"]等效于string 因此,您的呼叫现在可以按需工作了:

put(get("name")); // okay

希望能有所帮助。 祝好运!

链接到代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM