programing

형식 스크립트에서 변수 이름 가져오기

css3 2023. 6. 19. 21:56

형식 스크립트에서 변수 이름 가져오기

유형 스크립트에서 변수 이름을 가져오려면 어떻게 해야 합니까?저는 다음과 같은 것을 원합니다.

var name = "Foo";
alert(getVariableName(name)); //Prints "name"

basarat의 답변을 확장하여 변수에 대한 액세스를 포함하는 함수를 매개 변수로 사용하는 함수를 만들어야 합니다.자바스크립트에서는 어떤 함수의 코드에도 접근할 수 있기 때문에 정규식을 사용하여 변수 이름을 추출하는 것이 간단한 문제가 됩니다.

var varExtractor = new RegExp("return (.*);");
export function getVariableName<TResult>(name: () => TResult) {
    var m = varExtractor.exec(name + "");
    if (m == null) throw new Error("The function does not contain a statement matching 'return variableName;'");
    return m[1];
}

var foo = "";
console.log(getVariableName(() => foo));

한 가지 접근 방식은 이러한 값을 객체에 저장하는 것입니다.

var o = {
    firstName: "Homer",
    lastName: "Simpson"
};

이름을 알 수 없습니다.o그러나 다음과 같은 두 가지 속성의 이름(또는 "키")을 얻을 수 있습니다.

var k = Object.keys(o);
console.log(k[0]); // prints "firstName"

Cernicova-Dragomir의 답변 확장:

basarat의 답변을 확장하여 변수에 대한 액세스를 포함하는 함수를 매개 변수로 사용하는 함수를 만들어야 합니다.자바스크립트에서는 어떤 함수의 코드에도 접근할 수 있기 때문에 정규식을 사용하여 변수 이름을 추출하는 것이 간단한 문제가 됩니다.

개체의 필드도 지원합니다.

var varExtractor = new RegExp("(.*)");

export function getVariableName<TResult>(getVar: () => TResult) {
    var m = varExtractor.exec(getVar + "");

    if (m == null)
        throw new Error("The function does not contain a statement matching 'return variableName;'");

    var fullMemberName = m[1];
    var memberParts = fullMemberName.split('.');

    return memberParts[memberParts.length-1];
}

var foo = { bar: "" };
var varName = getVariableName(() => foo.bar ); //prints "bar"

ES6를 대상으로 할 때 Node.js에서 작동하지 않기 때문에 "반환"을 삭제했습니다.

TypeScript는 런타임에 JavaScript입니다.따라서 거기에 적용되는 것과 같은 제한이 적용됩니다: 자바스크립트에서 변수의 '이름'을 가져옵니다.

하지만 당신은 다음과 같은 것들을 할 수 있습니다.

alert(getVariableName(()=>name)) 

여기서 getVariableName으로 전달된 함수의 본문을 구문 분석하고 문자열로 가져옵니다.

//typescript
function getVarName(obj: object): string {
  const keys = Object.keys(obj);
  console.assert(keys.length == 1, 'key count must be 1');
  return keys[0];
}
const simpleName = 123;
console.log(getVarName({ simpleName }), simpleName);

또는

//javascript
"use strict";
function getVarName(obj) {
    const keys = Object.keys(obj);
    console.assert(keys.length == 1, 'key count must be 1');
    return keys[0];
}
const simpleName = 123;
console.log(getVarName({ simpleName }), simpleName);

출력됩니다.

[LOG]: 단순 이름, 123

하지만 저는 그것이 런타임 대신 컴파일 시간에 끝나야 한다고 생각합니다.

변수가 클래스/인터페이스의 일부인 경우, 다음과 같은 간단한 해결책이 있습니다.

function getFieldName<T, K extends keyof T = keyof T>(name: K): K {
    return name;
}

예.const name = getFieldName<SomeInterface>('some_field')컴파일 시간 보증을 제공합니다.name포함하다'some_field',그리고.some_field의 유효한 필드입니다.SomeInterface.

언급URL : https://stackoverflow.com/questions/29191451/get-name-of-variable-in-typescript