[英]Typescript: How to use a generic parameter as object key
是否可以編寫一個接受字符串常量作為其參數之一並將其用作對象鍵的接口?
例如,假設我發出了兩個不同的GraphQL請求,兩個請求都返回一個User
,但是使用不同的鍵名:
const userByIdResult = {
data: {
userById: {
id: 123,
username: 'joseph'
}
}
}
const userByUsernameResult = {
data: {
userByUsername: {
id: 123,
username: 'joseph'
}
}
}
我可以想象編寫一個通用接口會像這樣:
interface GraphQLResponse<QueryKey, ResponseType> {
data: {
[QueryKey]: ResponseType
}
}
interface User {
username: string
id: string
}
type UserByIdResponse = GraphQLResponse<'userById', User>
type UserByUsernameResponse = GraphQLResponse<'userByUsername', User>
但是, 這不起作用 。
你近了 這屬於“映射類型 ” 類別 。 您需要進行兩項更改:
QueryKey extends string
key in QueryKey
interface GraphQLResponse<QueryKey extends string, ResponseType> {
data: {
[key in QueryKey]: ResponseType;
}
}
interface User {
username: string;
id: number;
}
type UserByIdResponse = GraphQLResponse<'userById', User>;
type UserByUsernameResponse = GraphQLResponse<'userByUsername', User>;
const userByIdResult: UserByIdResponse = {
data: {
userById: {
id: 123,
username: 'joseph'
}
}
}
const userByUsernameResult: UserByUsernameResponse = {
data: {
userByUsername: {
id: 123,
username: 'joseph'
}
}
}
const userByIdResultBoom: UserByIdResponse = {
data: {
userByUsername: {
id: 123,
username: 'joseph'
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.