Naskah: perbedaan antara String dan string

257

Adakah yang tahu perbedaan antara String dan string dalam TypeScript? Apakah saya benar berasumsi bahwa mereka harus sama?

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

Versi saat ini dari kompiler mengatakan:

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

Apakah itu bug?

Paul0515
sumber
1
Saya pikir "apakah itu bug" sebenarnya adalah pertanyaan filosofis yang bagus. Ini mungkin "dimaksudkan" begitu tetapi itu menciptakan kebingungan dan kompilasi kesalahan. Saya pikir itu setidaknya masalah.
Gherman

Jawaban:

252

Berikut adalah contoh yang menunjukkan perbedaan, yang akan membantu penjelasannya.

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

Stringadalah tipe String JavaScript, yang dapat Anda gunakan untuk membuat string baru. Tidak ada yang melakukan ini seperti dalam JavaScript literal dianggap lebih baik, jadi s2dalam contoh di atas membuat string baru tanpa menggunakan newkata kunci dan tanpa secara eksplisit menggunakan Stringobjek.

string adalah tipe string TypeScript, yang bisa Anda gunakan untuk mengetik variabel, parameter, dan mengembalikan nilai.

Catatan tambahan...

Saat ini (Feb 2013) Keduanya s1dan s2adalah JavaScript yang valid. s3adalah TypeScript yang valid.

Penggunaan String. Anda mungkin tidak perlu menggunakannya, string literal diterima secara universal sebagai cara yang tepat untuk menginisialisasi string. Dalam JavaScript, juga dianggap lebih baik menggunakan literal objek dan literal array juga:

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

Jika Anda benar-benar memiliki kecenderungan untuk string, Anda dapat menggunakannya dalam TypeScript dalam salah satu dari dua cara ...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type
Fenton
sumber
Terima kasih untuk membersihkannya. Jadi aman untuk menggunakan string tipe primitif untuk menghindari kemungkinan masalah konversi tipe ketika menggunakan lib lain yang bekerja dengan nilai string (berdasarkan gagasan bahwa tidak ada yang benar-benar menggunakan String (?)). Bukankah seharusnya tugas antara string dan String dan sebaliknya diperlakukan sama?
Paul0515
1
Ini sebenarnya aman untuk digunakan karena tipe-tipe TypeScript dilucuti untuk memberi Anda 100% JavaScript yang kompatibel (baik dalam rasa ES3 atau ES5, dan dalam rasa ES6 versi 1). Saya akan merekomendasikan menggunakan stringjenis dan inisialisasi literal: var s: string = "My String";.
Fenton
sebagai catatan, terima kasih untuk tipe-inferensi, var s: string = "My String"identik dengan var s = "My String"... juga, tidak peduli berapa kali saya membaca jawaban ini, saya masih tidak memahami tujuan dari stringtipe dalam TypeScript, karena, pada akhir hari , ('My String')['constructor'] === String...
mindplay.dk
2
Anda biasanya akan menambahkan anotasi jika Anda tidak menginisialisasi variabel dengan nilai.
Fenton
2
Saya telah menambahkan jawaban untuk mengklarifikasi bahwa "foo" vs String baru ("foo") bukan perbedaan baru yang diperkenalkan oleh TypeScript - Saya tidak berpikir itu membantu untuk memanggil satu tipe JS dan yang lainnya tipe TS.
Joe Lee-Moyet
60

Kedua jenis ini berbeda dalam JavaScript dan juga TypeScript - TypeScript hanya memberi kita sintaksis untuk membubuhi keterangan dan memeriksa jenis saat kita melanjutkan.

Stringmengacu pada contoh objek yang memiliki String.prototyperantai prototipe. Anda bisa mendapatkan contoh seperti itu dengan berbagai cara misalnya new String('foo')dan Object('foo'). Anda dapat menguji untuk instance dari Stringjenis dengan instanceofoperator, misalnya myString instanceof String.

stringadalah salah satu tipe primitif JavaScript, dan stringnilai utamanya dibuat dengan literal misalnya'foo' dan "bar", dan sebagai tipe hasil dari berbagai fungsi dan operator. Anda dapat menguji untuk stringjenis menggunakan typeof myString === 'string'.

Sebagian besar waktu, stringadalah jenis yang harus Anda gunakan - hampir semua antarmuka API yang mengambil atau mengembalikan string akan menggunakannya. Semua tipe primitif JS akan dibungkus ( kotak ) dengan tipe objek yang sesuai ketika menggunakannya sebagai objek, misalnya mengakses properti atau metode panggilan. Karena Stringsaat ini dideklarasikan sebagai antarmuka daripada kelas di pustaka inti TypeScript , pengetikan struktural berarti stringsubtipe Stringyang menjadi alasan mengapa baris pertama Anda melewati pemeriksaan jenis kompilasi.

Joe Lee-Moyet
sumber
2

Dalam JavaScript, string dapat berupa tipe primitif string atau objek string. Kode berikut menunjukkan perbedaan:

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

Kesalahan Anda:

Ketik 'String' tidak dapat ditugaskan untuk mengetik 'string'. 'string' adalah primitif, tetapi 'String' adalah objek pembungkus. Lebih suka menggunakan 'string' bila memungkinkan.

Dilemparkan oleh kompiler TS karena Anda mencoba menetapkan tipe stringke tipe objek string (dibuat melalui newkata kunci). Compiler memberi tahu Anda bahwa Anda harus menggunakan tipe stringhanya untuk tipe primitif string dan Anda tidak bisa menggunakan tipe ini untuk menggambarkan tipe objek string.

Willem van der Veen
sumber
1

TypeScript: Stringvsstring

Argumen tipe 'String' tidak dapat ditentukan untuk parameter tipe 'string'.

'string' adalah primitif, tetapi 'String' adalah objek pembungkus.

Lebih suka menggunakan 'string' bila memungkinkan.

demo

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

string primitif

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

masukkan deskripsi gambar di sini

xgqfrms
sumber