Nasıl açıkça daktilo window` `yeni bir özellik ayarlarım?

oy
247

Ben kurulum açıkça bir özelliğini ayarlayarak benim nesneler için küresel ad window.

window.MyNamespace = window.MyNamespace || {};

Typescript altını çizer MyNamespaceve şikayet:

mülkiyet 'MyNamespace' türü 'pencere' Herhangi değerine yok

Ben bildirerek kod çalışması yapabilir MyNamespacebir ortam değişken olarak bırakarak windowbelirginliği ama bunu yapmak istemiyorum.

declare var MyNamespace: any;

MyNamespace = MyNamespace || {};

Nasıl tutabilir windoworada ve typescript mutlu?

Bir yan not olarak ben özellikle komik olduğunu söylüyor beri typescript şikayet bulmak windowtiptedir anykesinlikle bir şey içerebilir.

Oluştur 03/10/2012 saat 14:01
kaynak kullanıcı
Diğer dillerde...                            


19 cevaplar

oy
253

Dinamik tutmak için, sadece kullanın:

(<any>window).MyNamespace
Cevap 09/06/2015 saat 19:18
kaynak kullanıcı

oy
235

Sadece bunun cevabını buldum başka bir StackOverflow Sorunun cevabı .

declare global {
    interface Window { MyNamespace: any; }
}

window.MyNamespace = window.MyNamespace || {};

Temelde mevcut uzatmak gerekir windowyeni özellik hakkında onu anlatmak için arayüz.

Cevap 03/10/2012 saat 14:46
kaynak kullanıcı

oy
127

Veya...

Sadece yazabilirsiniz:

window['MyNamespace']

ve alışkanlık bir derleme hatası almak ve onu yazarak gibi çalışır window.MyNamespace

Cevap 20/11/2012 saat 20:36
kaynak kullanıcı

oy
84

TSX kullanarak? diğer yanıtlardan hiçbiri benim için çalışıyorlardı.

İşte ne yaptım:

(window as any).MyNamespace
Cevap 15/08/2016 saat 23:25
kaynak kullanıcı

oy
46

Kabul cevabı ben, ama typescript 0.9 ile kullanmak için kullanılan budur. * Artık çalışır. Yeni tanımı Windowarayüzüne tamamen yerine onu artırmada arasında, yerleşik tanımını değiştirmek gibi görünüyor.

Bunun yerine bunu yapmaya almış:

interface MyWindow extends Window {
    myFunction(): void;
}

declare var window: MyWindow;

GÜNCELLEME: typescript 0.9.5 ile kabul cevabı yeniden çalışıyor.

Cevap 27/08/2013 saat 22:22
kaynak kullanıcı

oy
29

Eğer uzatmak gerekiyorsa windowkullanımını gerektiren özel bir türü ile nesne importaşağıdaki yöntemi kullanabilirsiniz size:

window.d.ts

import MyInterface from './MyInterface';

declare global {
    interface Window {
        propName: MyInterface
    }
}

El Kitabı'nın 'Deklarasyonu birleştirme' bölümünde 'Küresel Büyütme' Bkz: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation

Cevap 23/10/2016 saat 15:24
kaynak kullanıcı

oy
19

Küresel "kötülük" :), ben de taşınabilirlik için en iyi yol olduğunu düşünüyoruz gibidir:

Öncelikle arayüz ihracat: (örn: ./custom.window.ts)

export interface CustomWindow extends Window {
    customAttribute: any;
}

İkinci içe

import {CustomWindow} from './custom.window.ts';

Üçüncü CustomWindow küresel var penceresini dökme

declare let window: CustomWindow;

Bu şekilde bu son denemede yüzden, pencere nesnesinin mevcut nitelikleri ile kullanırsanız farklı IDE da kırmızı çizgiyi yok:

window.customAttribute = 'works';
window.location.href = '/works';

Typescript 2.4.x ile test edilmiştir

Cevap 27/07/2017 saat 13:28
kaynak kullanıcı

oy
8

Burada kullanıyorsanız, bunu yapmak için nasıl typescript Tanımı Yöneticisi !

npm install typings --global

oluştur typings/custom/window.d.ts:

interface Window {
  MyNamespace: any;
}

declare var window: Window;

Özel yazarak yükleyin:

typings install file:typings/custom/window.d.ts --save --global

Bitti, kullan ! Typescript artık şikayet olmaz:

window.MyNamespace = window.MyNamespace || {};
Cevap 19/11/2016 saat 21:31
kaynak kullanıcı

oy
7

Ben çok sık katman ile Redux DevTools'un kullanırken oldu oldu sadece durum bunu yapmak gerekmez.

Sadece yaptı:

const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

Yoksa yapabilirdi:

let myWindow = window as any;

ve sonra myWindow.myProp = 'my value';

Cevap 06/06/2018 saat 13:13
kaynak kullanıcı

oy
5

Diğer cevapların çoğu mükemmel değildir.

  • Bazıları sadece dükkan için tip çıkarımlar bastırmak.
  • başkalarının bazıları sadece ad olarak küresel değişkeni umurunda değil arayüz / sınıf olarak

Ben de bu sabah benzer sorunla karşılaşırsanız. Ben SO bu kadar çok "çözümler" çalıştı, ancak bunların hiçbiri hiçbir tür hatası kesinlikle üretmek ve IDE (WebStorm veya vscode) yazın atlama tetikleme sağlar.

Son olarak, buradan

https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-102523512

Ben makul bir çözüm bulmak hem arayüz / sınıf ve ad gibi davranan küresel değişken için typings takmak .

Örnek aşağıdaki gibidir:

// typings.d.ts
declare interface Window {
    myNamespace?: MyNamespace & typeof MyNamespace
}

declare interface MyNamespace {
    somemethod?()
}

declare namespace MyNamespace {
    // ...
}

Şimdi, yukarıdaki kod ad alanının typings birleştirir MyNamespaceve arayüz MyNamespaceglobal değişken içine myNamespace(pencerenin özelliği).

Cevap 19/05/2017 saat 03:26
kaynak kullanıcı

oy
5

Eğer kullanıyorsanız Açısal CLI o (CLI RC.0 üzerinde test) gerçekten basittir:

src / polyfills.ts

declare global {
  interface Window {
    myCustomFn: () => void;
  }
}

my-özel-utils.ts

window.myCustomFn = function () {
  ...
};

Ben IntelliJ kullanıyorum, o yüzden de benim yeni polyfills aldı önce IDE aşağıdaki ayarı değiştirmek için gereken:

> File 
> Settings 
> Languages & Frameworks 
> TypeScript 
> check 'Use TypeScript Service'.
Cevap 21/03/2017 saat 13:38
kaynak kullanıcı

oy
2

Bir bilgisayarlı veya dinamik özelliğini ayarlamak isteyenler için windownesne, sen ile bu mümkün değil bulacaksınız declare globalyöntemle. Bu kullanım şeklini açıklığa kavuşturmak için

window[DynamicObject.key] // Element implicitly has an 'any' type because type Window has no index signature

Böyle bir şey yapmak deneyebilir

declare global {
  interface Window {
    [DyanmicObject.key]: string; // error RIP
  }
}

Yukarıda olsa hata olur. Bu daktilo, arayüzler bilgisayarlı özelliklerle iyi oynamak yok ve benzeri bir hata atar çünkü

A computed property name in an interface must directly refer to a built-in symbol

Bundan kaçınmak için, döküm önermek ile gidebilirsiniz windowiçin <any>böylece yapabilirsiniz

(window as any)[DynamicObject.key]
Cevap 13/02/2019 saat 00:15
kaynak kullanıcı

oy
2

Özel bir arayüz Pencere uzanır yapın ve isteğe bağlı olarak özelleştirilmiş özellik ekleyebilir.

Ardından, özel arayüzü kullanmak customWindow izin, ancak orijinal pencere ile değerli.

Bu typescript@3.1.3 ile çalışmış.

interface ICustomWindow extends Window {
  MyNamespace?: any
}

const customWindow:ICustomWindow = window;

customWindow.MyNamespace = customWindow.MyNamespace {} 
Cevap 12/11/2018 saat 07:29
kaynak kullanıcı

oy
2

Bugün bir Açısal (6) kütüphanesinde bu kullanmak istedi ve beklendiği gibi bu işe almak için biraz zaman aldı.

Bildirimleri kullanmak benim kütüphanesi için Amacıyla ben kullanmak zorunda d.tsküresel nesnenin yeni özelliklerini beyan dosyası için usantısı.

Yani sonunda, dosya gibi bir şey ile sona erdi:

/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts

Yaratılan kez Gözlerinde farklı maruz unutmayın public_api.ts.

Bu benim için yaptı. Bu yardımcı olur umarım.

Cevap 01/08/2018 saat 11:29
kaynak kullanıcı

oy
2

Başvuru için (bu doğru cevaptır):

Bir İçinde .d.tstanım dosyası

type MyGlobalFunctionType = (name: string) => void

tarayıcıda çalışıyorsanız, Pencere arayüzünü yeniden açılması ile tarayıcının pencere bağlamda üye eklemek:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

NodeJS için aynı fikir:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType
  }
}

Şimdi kök değişkeni (aslında pencere veya küresel yaşayacak) beyan

declare const myGlobalFunction: MyGlobalFunctionType;

Sonra düzenli içinde .tsdosyanın, ancak yan etki olarak ithal, aslında bunu uygulamaya:

global/* or window */.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

Ve son olarak, kod temeli başka biriyle kullanabilirsiniz:

global/* or window */.myGlobalFunction("Kevin");

myGlobalFunction("Kevin");
Cevap 20/04/2017 saat 15:50
kaynak kullanıcı

oy
1

Eğer typescript 3.x kullanıyorsanız, sen ihmal mümkün olabilir declare globaldiğer cevaplar yer ve bunun yerine sadece kullanın:

interface Window {
  someValue: string
  another: boolean
}

Typescript 3.3, WebPack ve TSLint kullanılırken bu benimle çalıştı.

Cevap 12/02/2019 saat 21:50
kaynak kullanıcı

oy
0

Typscript dize özelliklerine typecheck gerçekleştirmez.

window["newProperty"] = customObj;

İdeal olarak, genel değişken senaryo kaçınılması gerekir. Ben tarayıcı konsoluna bir nesne hata ayıklamak için bunu kullanırım.

Cevap 18/06/2019 saat 22:01
kaynak kullanıcı

oy
0

Önce geçerli kapsamda pencere nesnesi bildirmek gerekir.
Typescript nesne türünü bilmek istiyorum çünkü.
Pencere nesne başka bir yerde tanımlandığı için bunu yeniden tanımlamak mümkün değil.
Aşağıdaki gibi Ama bunu bildirebilirsiniz: -

declare var window: any;

Bu pencere nesnesini yeniden tanımlamak etmez veya bir adla başka değişken oluşturmak olmayacaktır window.
Bu pencere başka bir yerde tanımlanır ve sadece geçerli kapsamda onu referans gösteren demektir.

Sonra basitçe ederek MyNamespace nesnesine başvurabilirsiniz: -

window.MyNamespace

Ve şimdi typescript şikayetçi olmaz.

Cevap 01/06/2019 saat 01:41
kaynak kullanıcı

oy
-1

Cevaplar etrafında bulduktan sonra, bu sayfa yararlı olabileceğini düşünüyorum. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation beyan birleştirilmesi tarihi hakkında emin değilim, ama şu işe yarayabilir neden açıklıyor değil.

declare global {
    interface Window { MyNamespace: any; }
}

window.MyNamespace = window.MyNamespace || {};
Cevap 16/03/2017 saat 17:38
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more