타이프 스크립트 : 문자열과 문자열의 차이점


256

누구든지 TypeScript에서 문자열과 문자열의 차이점을 알고 있습니까? 그들이 같아야한다고 가정 할 때 정확합니까?

var a: String = "test";
var b: string = "another test";
a = b;
b = a; // this gives a compiler error!

컴파일러의 현재 버전은 다음과 같이 말합니다.

Type 'String' is not assignable to type 'string'.
  'string' is a primitive, but 'String' is a wrapper object.
     Prefer using 'string' when possible.

그게 버그 야?


1
나는 "버그라고 생각한다"는 것은 정말 좋은 철학적 질문이라고 생각합니다. 아마도 "의도 된"것일 수도 있지만 혼동과 컴파일 오류가 발생합니다. 나는 그것이 적어도 문제라고 생각합니다.
Gherman

답변:


252

다음은 차이점을 보여주는 예이며 설명에 도움이됩니다.

var s1 = new String("Avoid newing things where possible");
var s2 = "A string, in TypeScript of type 'string'";
var s3: string;

String새 문자열을 만드는 데 사용할 있는 JavaScript 문자열 유형 입니다. JavaScript에서는 리터럴이 더 나은 것으로 간주되지 않으므로 s2위의 예에서는 new키워드를 사용하지 않고 명시 적으로 String객체를 사용하지 않고 새 문자열을 만듭니다 .

string 변수, 매개 변수 및 리턴 값을 입력하는 데 사용할 수있는 TypeScript 문자열 유형입니다.

추가 참고 사항 ...

현재 (년 2 월 2013) 모두 s1와는 s2자바 스크립트 유효합니다. s3유효한 TypeScript입니다.

의 사용 String. 문자열 리터럴은 문자열을 초기화하는 올바른 방법으로 보편적으로 허용됩니다. JavaScript에서는 객체 리터럴과 배열 리터럴도 사용하는 것이 좋습니다.

var arr = []; // not var arr = new Array();
var obj = {}; // not var obj = new Object();

실제로 문자열에 문제가 있다면 TypeScript에서 두 가지 방법 중 하나로 사용할 수 있습니다 ...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type

그것을 제거해 주셔서 감사합니다. 따라서 문자열 값으로 작동하는 다른 라이브러리를 사용할 때 가능한 아무도 유형 변환 문제를 피하기 위해 primitve 유형 문자열을 사용하는 것이 안전합니다. 문자열과 문자열 사이의 할당과 그 반대로의 할당을 동일하게 처리해서는 안됩니까?
Paul0515

1
TypeScript 유형이 제거되어 100 % 호환되는 JavaScript (ES3 또는 ES5 버전 및 버전 1 ES6 버전)를 제공하므로 실제로 사용하는 것이 안전합니다. string유형과 리터럴 초기화를 사용하는 것이 좋습니다 var s: string = "My String";.
Fenton

형식 유추 덕분에 레코드 var s: string = "My String"는 동일합니다 var s = "My String"... 또한이 응답을 몇 번이나 읽더라도 관계없이 stringTypeScript 에서 형식 의 목적을 파악하지 못하고 있습니다. , ('My String')['constructor'] === String...
mindplay.dk 21

2
변수를 값으로 초기화하지 않은 경우 일반적으로 주석을 추가합니다.
Fenton

2
"foo"와 new String ( "foo")은 TypeScript에서 소개 한 새로운 차이점이 아님을 명확히하기위한 답변을 추가했습니다. JS 형식과 TS 형식을 호출하는 것이 도움이되지 않는다고 생각합니다.
Joe Lee-Moyet

60

두 가지 유형은 JavaScript뿐만 아니라 TypeScript에서도 구별됩니다. TypeScript는 유형에 주석을 달고 확인하는 구문을 제공합니다.

StringString.prototype프로토 타입 체인에 있는 객체 인스턴스를 나타냅니다 . 당신은 여러 가지 방법이 예에서 이러한 경우를 얻을 수 new String('foo')Object('foo'). 연산자 를 사용하여 String유형 의 인스턴스를 테스트 할 수 있습니다 ( instanceof예 :) myString instanceof String.

string은 JavaScript의 기본 유형 중 하나이며 string값은 주로 리터럴 (예 : 'foo'"bar")을 사용하여 다양한 함수 및 연산자의 결과 유형으로 작성됩니다. 다음을 string사용하여 유형을 테스트 할 수 있습니다.typeof myString === 'string' .

대부분의 시간 string은 사용해야하는 유형입니다. 문자열을 가져 오거나 반환하는 거의 모든 API 인터페이스가이를 사용합니다. 모든 JS 프리미티브 유형은 속성에 액세스하거나 메소드를 호출하는 등의 객체로 사용할 때 해당 객체 유형 으로 래핑 ( boxed )됩니다. TypeScript의 핵심 라이브러리String 에서 클래스가 아닌 인터페이스로 현재 선언되어 있기 때문에 구조적 타이핑은 하위 유형으로 간주되는 첫 번째 행이 컴파일 유형 검사를 통과 하는 것을 의미 합니다.stringString


2

JavaScript에서 문자열은 문자열 기본 유형이거나 문자열 객체 일 수 있습니다. 다음 코드는 차이점을 보여줍니다.

var a: string = 'test'; // string literal
var b: String = new String('another test'); // string wrapper object

console.log(typeof a); // string
console.log(typeof b); // object

오류 :

'string'유형은 'string'유형에 지정할 수 없습니다. 'string'은 기본이지만 'String'은 래퍼 객체입니다. 가능하면 '문자열'을 사용하십시오.

유형 string을 문자열 객체 유형 ( new키워드 를 통해 생성됨) 에 지정하려고했기 때문에 TS 컴파일러에서 발생합니다 . 컴파일러는 string문자열 기본 유형에만 유형을 사용해야하며 문자열 객체 유형을 설명하는 데이 유형을 사용할 수 없다고 알려줍니다 .


1

TypeScript : Stringvsstring

'String'유형의 인수는 'string'유형의 매개 변수에 지정할 수 없습니다.

'string'은 기본이지만 'String'은 래퍼 객체입니다.

가능하면 '문자열'을 사용하십시오.

데모

문자열 객체

// error
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: String = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: String = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

문자열 프리미티브

// ok
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: string = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: string = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

여기에 이미지 설명을 입력하십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.