如何在 TypeScript 中访问接口的底层原始字段?
How to access underlying raw field of an Interface in TypeScript?
我对 TypeScript 有点陌生,想知道如何访问扩展接口的 Class 的原始字段?
例如
export interface APIGatewayProxyEventHeaders {
[name: string]: string | undefined;
}
getMap(headers: APIGatewayProxyEventHeaders): Map<string, string> {
const map: Map<string, string> = headers.getUnderlyingMap();
return map;
}
所以我想要一些好的方法来实现想象中的 headers.getUnderlyingMap()
调用的目的?
我不确定 [name: string]: string | undefined
的类型是什么?
它是某种特殊的 TypeScript 结构吗?我似乎能做的就是 headers["xxx"]
.
谢谢!
更新:
感谢您的帮助,我能够做到这一点来实现我想要的:
export interface APIGatewayProxyEventHeaders {
[name: string]: string | undefined;
}
export class InternalEvent {
constructor(
public reqHeaders: {}) {
}
static fromInternalEvent(headers: APIGatewayProxyEventHeaders): InternalEvent {
return new InternalEvent(headers);
}
}
您可以将此类型 [name: string]: string | undefined
视为对象(字典),其中所有键都是字符串,值是字符串或未定义。
这里有几个例子可以更好地理解它:
interface Dictionary {
[name: string]: string | undefined
}
const x: Dictionary = {
name: 'John',
surname: 'Doe'
} // ok
const y: Dictionary = {
name: 'John',
1: 'hello'
} // ok, because JS make coersion under the hood, so you can acces x['1']
/**
* Indexed types are more generic, because you can use any key you want
*/
y['any key I want'] // valid, returns undefined
y['()=>{}'] // like I said, any key)
const z: Dictionary = {
name: 23
} // error, value can be either string or undefined, but not number
APIGatewayProxyEventHeaders
是一个对象,像这样:
{
key1: "somevalue",
key2: "someothervalue",
key3: undefined
}
对象的接口定义意味着您需要测试键和值是否存在。如果两者都为真,那么你就有了一个字符串。
像这样:
// const obj: APIGatewayProxyEventHeaders
if (!!obj[key]) {
// obj[key] is a string
}
if (obj.hasOwnProperty(key)) {
// obj[key] is string | undefined
}
您可以像这样将此对象转换为地图:
const map = new Map(Object.entries(obj))
现在您有了一个包含值的地图。但这并没有太大的优势,因为你没有任何额外的类型信息——只是一个不同的数据结构。
我对 TypeScript 有点陌生,想知道如何访问扩展接口的 Class 的原始字段?
例如
export interface APIGatewayProxyEventHeaders {
[name: string]: string | undefined;
}
getMap(headers: APIGatewayProxyEventHeaders): Map<string, string> {
const map: Map<string, string> = headers.getUnderlyingMap();
return map;
}
所以我想要一些好的方法来实现想象中的 headers.getUnderlyingMap()
调用的目的?
我不确定 [name: string]: string | undefined
的类型是什么?
它是某种特殊的 TypeScript 结构吗?我似乎能做的就是 headers["xxx"]
.
谢谢!
更新:
感谢您的帮助,我能够做到这一点来实现我想要的:
export interface APIGatewayProxyEventHeaders {
[name: string]: string | undefined;
}
export class InternalEvent {
constructor(
public reqHeaders: {}) {
}
static fromInternalEvent(headers: APIGatewayProxyEventHeaders): InternalEvent {
return new InternalEvent(headers);
}
}
您可以将此类型 [name: string]: string | undefined
视为对象(字典),其中所有键都是字符串,值是字符串或未定义。
这里有几个例子可以更好地理解它:
interface Dictionary {
[name: string]: string | undefined
}
const x: Dictionary = {
name: 'John',
surname: 'Doe'
} // ok
const y: Dictionary = {
name: 'John',
1: 'hello'
} // ok, because JS make coersion under the hood, so you can acces x['1']
/**
* Indexed types are more generic, because you can use any key you want
*/
y['any key I want'] // valid, returns undefined
y['()=>{}'] // like I said, any key)
const z: Dictionary = {
name: 23
} // error, value can be either string or undefined, but not number
APIGatewayProxyEventHeaders
是一个对象,像这样:
{
key1: "somevalue",
key2: "someothervalue",
key3: undefined
}
对象的接口定义意味着您需要测试键和值是否存在。如果两者都为真,那么你就有了一个字符串。
像这样:
// const obj: APIGatewayProxyEventHeaders
if (!!obj[key]) {
// obj[key] is a string
}
if (obj.hasOwnProperty(key)) {
// obj[key] is string | undefined
}
您可以像这样将此对象转换为地图:
const map = new Map(Object.entries(obj))
现在您有了一个包含值的地图。但这并没有太大的优势,因为你没有任何额外的类型信息——只是一个不同的数据结构。