type transaction = { uid: string, paymentMode : string, }Quiero obtener el nombre clave del tipo para, por ejemplo
function getFieldName(input) { returns a string with key name } const tran : transaction = {} getKeyName(tran.paymentMode) returns 'paymentMode'Leí muchos artículos y probé algunas soluciones, así que entiendo que al menos necesitaremos crear un objeto para ese tipo, lo cual está bien.
Quiero hacer esto porque se requiere el nombre clave de un tipo y también quiero mantener el autocompletado para el nombre clave cuando escribimos algo como obj.key para evitar errores.
Lo sé, puedo crear un objeto separado del tipo con clave constante, par de valores. Quiero evitar esto, porque luego necesitaremos cambiar lo mismo en 2 lugares cada vez que haya un cambio en el tipo, que se puede perder.
Editar:
Estaba buscando exactamente esto: nameof en C# . @Aleksey L. dijo esto en los comentarios.
Este parece ser el tipo de firma de función que desea:
Tenga en cuenta que cumple con sus criterios de compatibilidad con IntelliSense autocompletar/sugerir:
type Transaction = { uid: string; paymentMode: string; }; function getFieldName <T extends object, K extends keyof T>(o: T, key: K): K { return key; } const transaction: Transaction = { uid: window.crypto.randomUUID(), paymentMode: 'unknown', }; getFieldName(transaction, 'uid'); // "uid" getFieldName(transaction, 'paymentMode'); // "paymentMode" getFieldName(transaction, 'asdf'); /* ~~~~~~ Argument of type '"asdf"' is not assignable to parameter of type 'keyof Transaction'.(2345) */No es posible derivar un nombre de propiedad de cadena en JavaScript (o TypeScript) pasando una referencia al valor de la propiedad. JavaScript simplemente no tiene este tipo de capacidad de meta-introspección en la actualidad.
Parece que su pregunta no se trata solo de seguridad de tipo, sino de DX/ergonomía. La solución anterior requiere proporcionar el nombre de la propiedad, pero la cantidad de caracteres adicionales para escribir antes de obtener el mensaje de IntelliSense es solo 1 (2 si considera los espacios en blanco):
// For: obj.prop: // desired: fn(obj.p_) // 012^ // proposed: fn(obj, 'p_') // 01234^ // The closing quote is auto-inserted by IntelliSense, just like the closing parenthesis.