namedtuple - Hur man får åtkomst till namnet på en namngiven tuppel i Typescript


Jag vill få åtkomst till namnet från en namngiven tuppel för att använda det inom en av mina funktioner. Finns det ett sätt att endast få åtkomst till namnet, liknande hur man kan få åtkomst till typen endast genom att använda indexet för tuppelns element.

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

Jag förstår att detta kan göras i Python på det sätt jag beskrev ovan. Här är ett svar som visar det. Hur kan jag göra detta i Typescript?

Svar #1

Typescript finns trots allt för att generera Javascript-runtime. Av denna anledning är vissa saker inte möjliga om inte Javascript själv stöder det.

Om du skulle kompilera följande kod:

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 }

Det blir:

exports.nTuple = ["email", 123];
exports.nStruct = { emailId: "email", anotherField: 123 };

Observera att det inte finns något sätt att veta emailId och anotherField från nTuple. Eftersom Javascript inte har några namngivna tupler från början. Ingen faktisk datatyp översätts till js.

Om du skulle implementera en namngiven tuppel liknande den från Python, måste du göra det manuellt, till exempel:

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]

Relaterade artiklar