TypeScript - yinelenen tanımlayıcı


TypeScript 2.0 kodumda (Visual Studio 2015'te), şunlara sahibim:

var lang = navigator.language 
         ? navigator.language 
         : navigator.systemLanguage;

Bununla birlikte, bu hatayı alıyorum:

Build:Property 'systemLanguage' does not exist on type 'Navigator'.

Ancak, bunu d.ts dosyalarımdan birine eklersem:

interface Navigator {
  systemLanguage: string;
}

Sonra elde ediyorum:

TS2300  Duplicate identifier 'systemLanguage'.

Bu TypeScript çıkmazını nasıl kırabilirim?

Cevap #1

Sorunuzdan, navigator'ın Navigator türünde bir değişken olduğunu çıkarıyorum. Paylaştığınız ilk hatadan, sorunun ya (1) o Navigator arayüzünün systemLanguage adında bir özelliğe sahip olmaması ya da (2) kod dosyanızda navigator'ın Navigator türünde olduğunu belirtmemeniz olduğunu tahmin ederdim. Paylaştığınız ikinci hatadan ise, sorununuzun büyük olasılıkla (2) numaralı sorunla ilgili olduğundan oldukça eminim.

Typescript tüm .ts dosyalarını derlediğinden, systemLanguage özelliğine sahip Navigator arayüzünü eklediğinizde, aynı ada ve aynı özelliğe sahip başka bir arayüzün zaten var olduğunu bulur, bu nedenle ikinci hata oluşur.

Bence yapmanız gereken şey (1) Navigation'ın nerede tanımlandığını bulmak, (2) bu tanımı ilk başvurduğunuz kodu içeren dosyaya aktarmak ve (3) navigator'ı Navigator tipi olarak tanımlamaktır.

DÜZENLEME: İşte bir örnek:

// your-code-file.ts
import Navigator from './path-to-code-file-with-navigator/navigator.ts'

...

let navigator:Navigator = ...;

...

var lang = navigator.language 
         ? navigator.language 
         : navigator.systemLanguage;


// navigator.ts
interface Navigator {
    language: string;
    systemLanguage: string;
}

Cevap #2

Navigator, lib.d.ts içinde tanımlanmıştır. systemLanguage artık Navigator arayüzünün bir özelliği değildir. Buradan kontrol edin https://github.com/Microsoft/TypeScript/blob/master/lib/lib.d.ts

Görünüşe göre 11 Nis 2016'da yapılan commit systemLanguage'i kaldırıyor.