我想访问命名元组中的名称,以便在我的一个函数中使用。有没有一种方法可以只访问名称,类似于使用元组元素的索引只访问类型。
type NamedThing = [emailId: string, anotherField: number]
// like you access the type here
type TypeOfFirst = NamedThing['0']
// how can I access the name here
const NameOfFirst = NamedThing['0']['__name__'] // Error on the __name__ accessor
我知道这可以用我上面描述的方法在python中完成。这里有一个答案可以说明这一点。我如何用打字稿做到这一点?
Typescript的存在毕竟是为了生成Javascript运行时。由于这个原因,如果Javascript本身不支持,有些事情是不可能的
如果您要编译以下代码:
type NamedThing = [
emailId: string, anotherField: number
]
type NamedThing2 = {
emailId: string; anotherField: number;
}
export const nTuple:NamedThing = ["email", 123]
export const nStruct:NamedThing2 = { emailId : "email", anotherField : 123 }
它变成:
exports.nTuple = ["email", 123];
exports.nStruct = { emailId: "email", anotherField: 123 };
注意,没有办法从nTuple中知道emailId
和anotherField
。因为Javascript一开始就没有命名元组。没有实际的数据类型被翻译成js。
如果要实现类似于Python的命名元组,则必须手动实现,例如:
function toTuple(obj:{[name:string]:any}) {
return Object
.keys(obj)
.map(key=>obj[key])
}
function getByIndex(obj:{[name:string]:any}, index:number) {
const key = Object
.keys(obj)[index]
return obj[key]
}
const nStruct = { emailId : "email", anotherField : 123 } // not actually named tuple.
const email = nStruct["emailId"] // as if it's named tuple.
const aField = getByIndex(nStruct, 1) // as if it's named tuple.
const actualTuple = toTuple(nStruct) // ["email", 123]