Dizgi: String ve string arasındaki fark


257

Herkes Dize ve TypeScript dize arasındaki farkı biliyor mu? Aynı olmaları gerektiğini varsayarak doğru muyum?

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

Derleyicinin şu anki sürümü diyor:

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

Bu bir hata mı?


1
Bence "bu bir böcek" gerçekten iyi bir felsefi soru. Muhtemelen böyle olması amaçlanmıştır, ancak karışıklık ve derleme hataları oluşturur. En azından bir sorun olduğunu düşünüyorum.
Gherman

Yanıtlar:


252

Açıklamaya yardımcı olacak farklılıkları gösteren bir örnek.

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

StringJavaScript dize türüdür olabilir yeni iplere oluşturmak için kullanın. Bunu JavaScript'te olduğu gibi kimse yapmaz, bu nedenle s2yukarıdaki örnekte newanahtar kelimeyi kullanmadan ve Stringnesneyi açıkça kullanmadan yeni bir dize oluşturur .

string değişkenleri, parametreleri ve döndürme değerlerini yazmak için kullanabileceğiniz TypeScript dize türüdür.

Ek Notlar...

Şu Anda (Şub 2013) Her ikisi de s1ve s2geçerli JavaScript. s3geçerli bir TypeScript.

Kullanımı String. Muhtemelen asla kullanmanıza gerek yoktur, dize değişmezleri evrensel olarak bir dize başlatmak için doğru yol olarak kabul edilir. JavaScript'te, nesne değişmezlerini ve dizi değişmezlerini de kullanmanın daha iyi olduğu düşünülür:

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

Dize için gerçekten bir tutkunuz varsa, bunu iki yoldan biriyle TypeScript'te kullanabilirsiniz ...

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

Bunu temizlemek için teşekkürler. Bu nedenle, dize değerleri ile çalışan diğer kütüphaneleri kullanırken olası tür dönüştürme sorunlarından kaçınmak için primitve tür dizesini kullanmak güvenlidir (kimsenin aslında String (?) Kullanmadığı fikrine dayanarak). String ve String ve viceversa arasındaki atamalara eşit davranılmamalı mı?
Paul0515

1
TypeScript türleri size% 100 uyumlu JavaScript (ES3 veya ES5 lezzetlerinde ve sürüm 1 ES6 lezzetinde) vermek için soyulduğundan kullanımı güvenlidir. Ben kullanarak öneriyoruz stringtürü ve değişmez başlatmayı: var s: string = "My String";.
Fenton

kayıt için, tür-çıkarım sayesinde var s: string = "My String", aynıdır var s = "My String"... ayrıca, bu cevabı kaç kez stringokursam da, günün sonunda, TypeScript'teki türün amacını hala anlamıyorum. , ('My String')['constructor'] === String...
mindplay.dk

2
Değişkeni bir değerle başlatmadıysanız, normalde ek açıklama eklersiniz.
Fenton

2
Ben "foo" vs yeni String ("foo") TypeScript tarafından tanıtılan yeni bir ayrım olmadığını açıklamak için bir cevap ekledim - bir JS türü ve diğeri bir TS türü çağırmak yararlı olduğunu düşünmüyorum.
Joe Lee-Moyet

60

Her iki tür de JavaScript'te ve TypeScript'te farklıdır - TypeScript bize devam ederken türlere açıklama ve kontrol etme sözdizimi verir.

String" String.prototypePrototip " terimi , prototip zincirinde bulunan bir nesne örneğini ifade eder . Böyle bir örneği çeşitli şekillerde alabilirsiniz, örn. new String('foo')Ve Object('foo'). Operatör Stringile türün bir örneğini test edebilirsiniz instanceof, örn myString instanceof String.

stringJavaScript'in ilkel türlerinden biridir ve stringdeğerler temel olarak değişmez değerler (ör.) 'foo've "bar"çeşitli işlevler ve işleçlerin sonuç türü olarak oluşturulur. stringKullanarak türü test edebilirsiniztypeof myString === 'string' .

Zamanın büyük çoğunluğu, stringkullanmanız gereken türdür - dizeleri alan veya döndüren neredeyse tüm API arabirimleri bunu kullanır. Tüm JS ilkel türleri, nesne olarak kullanıldığında, örneğin özelliklere erişme veya arama yöntemleri gibi, karşılık gelen nesne türleriyle sarılır ( kutulanır ). Yana Stringhalen bir arayüz yerine bir sınıf olarak ilan edilir typescript çekirdek kütüphanesinde , yapısal yazarak aracı stringbir alt tip olarak kabul edilir Stringhangi ilk satırı derleme tipi denetiminden geçmesi nedeni budur.


2

JavaScript'te dizeler dize ilkel tip veya dize nesneleri olabilir. Aşağıdaki kod ayrımı gösterir:

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

Sizin hatanız:

'String' türü, 'string' türüne atanamaz. 'string' bir ilkel, ancak 'String' bir sarmalayıcı nesnesidir. Mümkün olduğunda 'dize' kullanmayı tercih edin.

Türü stringbir dize nesnesi türüne ( newanahtar kelime ile oluşturulmuş ) atamaya çalıştığınız için TS derleyicisi tarafından atılır . Derleyici, türü stringyalnızca dize ilkel türleri için kullanmanız gerektiğini ve dize nesnesi türlerini tanımlamak için bu türü kullanamayacağınızı söylüyor.


1

TypeScript: Stringvsstring

'String' türündeki bağımsız değişken, 'string' türündeki parametreye atanamaz.

'string' bir ilkel, ancak 'String' bir sarmalayıcı nesnesidir.

Mümkünse 'dize' kullanmayı tercih edin.

gösteri

Dize Nesnesi

// 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));
  }
}

dize ilkel

// 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));
  }
}

resim açıklamasını buraya girin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.