TypeScript'te “* .d.ts” hakkında


343

Merak ediyorum hissediyorum *.d.tsçünkü ben TypeScript'te bir acemi. Ve birisi tarafından bu tür bir dosyanın C ++ 'da "head file" gibi bir şey olduğunu söyledim ama sadece JS için. Ama bir saf JS dosyayı dönüştürmek olamaz *.d.tsben forcely değiştirmediğiniz sürece dosyaya *.jsiçin *.ts. Üç dosyam var: JS dosyası, TS dosyası ve *.d.tsdosya.


  1. Aralarındaki ilişki nedir?

  2. *.d.tsDosyayı nasıl kullanabilirim ? Bu *.tsdosyayı kalıcı olarak silebileceğim anlamına mı geliyor ?

  3. Eğer öyleyse, *.d.tsdosya hangi JS dosyasının kendisine eşlendiğini nasıl bilebilir?


Birisi bana örnek verebilirse çok iyi olur.


Gelecekteki insanlar için: TypeScript belgesine göz atın: typescriptlang.org/docs/handbook/declaration-files/templates/…
J.Ko

Yanıtlar:


349

"D.ts" dosyası, JavaScript ile yazılmış bir API hakkında daktilo türü bilgileri sağlamak için kullanılır. Fikir, mevcut bir javascript kütüphanesi olan jQuery veya alt çizgi gibi bir şey kullanmanızdır. Bunları daktilo kodunuzdan tüketmek istiyorsunuz.

Jquery veya alt çizgi yeniden yazmak yerine, daktiloda ne olursa olsun, yalnızca tür ek açıklamalarını içeren d.ts dosyasını yazabilirsiniz. Daha sonra daktilo kodunuzdan, hala saf bir JS kütüphanesi kullanırken, statik tip kontrolünün daktilo avantajlarından faydalanırsınız.


26
Çok teşekkürler! Peki * .d.ts dosyasını bir js dosyasına nasıl eşleyebilirim? Js dosyası hangi d.ts dosyasının kendisine eşlendiğini nasıl biliyor? Bana bir örnek verebilirmisin?

3
Ancak d.ts dosyası js dosyasından oluşturulur ve js dosyası d.ts hakkında hiçbir şey bilmiyorsa. Js dosyası olmadan diğer ts dosyalarındaki d.ts işlevlerini çağırmak nasıl?

8
Bkz. Stackoverflow.com/questions/18091724/… . Tüketici ts dosyasının üstüne bir /// <referans satırı eklemeniz gerekir. Hem d.ts hem de .js dosyasının kullanılabilir olması gerekir.
Chris Tavares

3
d.ts dosyası genellikle js dosyası belgelerinden el yazısıdır. Bunların birçoğu popüler javascript kütüphaneleri için mevcuttur: github.com/borisyankov/DefinitelyTyped
basarat

12
Projeniz için özel dosyalar oluşturuyorsanız, özel d.ts dosyalarını nereye koyarsınız?
Jay

77

dBeyan Dosyası anlamına gelir :

Bir TypeScript komut dosyası derlendiğinde, derlenmiş JavaScript'teki bileşenlere arabirim işlevi gören bir bildirim dosyası (.d.ts uzantılı) oluşturma seçeneği vardır. Süreçte derleyici tüm işlev ve yöntem gövdelerini ayırır ve yalnızca dışa aktarılan türlerin imzalarını korur. Sonuçta ortaya çıkan bildirim dosyası, bir üçüncü taraf geliştirici tarafından TypeScript'ten tükendiğinde, bir JavaScript kitaplığının veya modülünün dışa aktarılan sanal TypeScript türlerini tanımlamak için kullanılabilir.

Bildirim dosyaları kavramı, C / C ++ 'da bulunan başlık dosyası kavramına benzer.

declare module arithmetics {
    add(left: number, right: number): number;
    subtract(left: number, right: number): number;
    multiply(left: number, right: number): number;
    divide(left: number, right: number): number;
}

JQuery ve Node.js gibi, varolan JavaScript kitaplıkları için tür bildirim dosyaları elle yazılabilir.

Popüler JavaScript kitaplıkları için büyük bildirim dosyaları koleksiyonları GitHub'da DefinitelyTyped ve Typings Registry'de barındırılmaktadır . Depolardaki bildirim dosyalarının aranmasına ve yüklenmesine yardımcı olmak için typings adlı bir komut satırı yardımcı programı sağlanır.


3
Not: typingsTypeScript 2.0'dan beri komut satırı aracına gerçekten gerek yoktur. Daha güncel olan yaklaşım, @typesad alanı altındaki npm deposu üzerinden yazma paketlerini kullanmaktır . Daha fazla ayrıntı için bkz. Github.com/typings/typings/blob/master/README.md
Burt_Harris

1
@takeshin Bir sorum var. Yalnızca projemde kullanılan .tsx dosyalarının .d.ts dosyalarını oluşturmam gerekiyor mu? Bunlar üçüncü taraf kütüphanelere ek bilgi vermenin yanı sıra başka bir şey daha ekliyor mu?
Krzysztof Trzos

63

Yorum yapamadım ve bu yüzden bunu bir cevap olarak ekliyorum.
Mevcut türleri bir javascript kütüphanesine eşlemeye çalışırken biraz acı çekiyorduk.

Bir .d.tsdosyayı javascript dosyasıyla eşlemek için, dosyaya javascript dosyasıyla .d.tsaynı adı vermeniz , aynı klasörde tutmanız ve .d.tsdosyaya gereken kodu göstermeniz gerekir .

örneğin: test.jsve test.d.tsiçindedir testdir/o zaman bir de böyle içe bileşeni tepki, klasörün:

import * as Test from "./testdir/test";

.d.tsDosya böyle bir ad olarak ihraç edilmiştir:

export as namespace Test;

export interface TestInterface1{}
export class TestClass1{}

42
Kimse d.ts js bağlamak için bir cevap verdi, bu yüzden bu doğru yer olduğunu düşündüm.
ConstantinM

Oluşturmadığınız bazı JS için bir bildirim dosyası oluşturuyorsanız (örneğin npm'den bir paket) .d.tsdosyanın içe aktarılacak paketle aynı şekilde adlandırılması gerektiğini unutmayın.
electrovir

31

Belirli bir vaka için çalışılan örnek :

Let Diyelim ki söylüyorlar my-modül aracılığıyla Sen paylaşma o NPM .

İle yüklersiniz npm install my-module

Bu şekilde kullanırsınız:

import * as lol from 'my-module';

const a = lol('abc', 'def');

Modülün mantığı şöyledir index.js:

module.exports = function(firstString, secondString) {

  // your code

  return result
}

Yazı eklemek için bir dosya oluşturun index.d.ts:

declare module 'my-module' {
  export default function anyName(arg1: string, arg2: string): MyResponse;
}

interface MyResponse {
  something: number;
  anything: number;
}

19

Gibi @takeshin dedi .d daktilo (.ts) için bildirim dosyası anlamına gelir.

Bu gönderiyi yanıtlamaya başlamadan önce açıklığa kavuşturulması gereken birkaç nokta var -

  1. Dizgi, javascriptin sözdizimsel üst kümesidir.
  2. Dizgi kendi başına çalışmaz, javascript'e aktarılması gerekir (dizgiden javascript dönüşümüne )
  3. "Tür tanımı" ve "Tür denetimi", typcript'in javascript üzerinden sağladığı temel ek işlevlerdir. ( tür komut dosyası ve javascript arasındaki farkı kontrol edin )

Dizginin sadece sözdizimsel üst küme olup olmadığını düşünüyorsanız, ne faydalar sağlar - https://basarat.gitbooks.io/typescript/docs/why-typescript.html#the-typescript-type-system

Bu gönderiyi cevaplamak için -

Tartıştığımız gibi, daktilo javascript'in üst kümesidir ve javascript'e aktarılması gerekir. Bir kitaplık veya üçüncü taraf kodu daktiloda yazılırsa, sonunda javascript projesi tarafından kullanılabilen javascript'e dönüştürülür, ancak tersi doğru olmaz.

Eski için -

Javascript kütüphanesini kurarsanız -

npm install --save mylib

ve daktilo kodunda içe aktarmayı deneyin -

import * from "mylib";

hata alırsınız.

Msgstr "'mylib' modülü bulunamadı."

@Chris tarafından belirtildiği gibi, alt çizgi, Jquery gibi birçok kütüphane zaten javascript ile yazılmıştır. Bu kütüphaneleri daktilo projeleri için yeniden yazmak yerine alternatif bir çözüme ihtiyaç vardı.

Bunu yapmak için, javascript kitaplığında * .d.ts adında, örneğin mylib.d.ts örneğinde olduğu gibi, tür bildirim dosyası sağlayabilirsiniz. Bildirim dosyası yalnızca ilgili javascript dosyasında tanımlanan işlevlerin ve değişkenlerin tür bildirimlerini sağlar.

Şimdi denediğinizde -

import * from "mylib";

mylib.d.ts içe aktarılır, bu da javascript kütüphane kodu ve typescript projesi arasında bir arayüz görevi görür.


3

Bu yanıt, TypeScript'e dönüştürmek istemediğiniz bazı JavaScript'lere sahip olduğunuzu varsayar, ancak türünüzde en az değişiklik yaparak yazım denetiminden yararlanmak istediğinizi varsayar .js. Bir .d.tsdosya, C veya C ++ başlık dosyasına çok benzer. Amacı bir arayüz tanımlamaktır. İşte bir örnek:

mashString.d.ts

/** Makes a string harder to read. */
declare function mashString(
    /** The string to obscure */
    str: string
):string;
export = mashString;

mashString.js

// @ts-check
/** @type {import("./mashString")} */
module.exports = (str) => [...str].reverse().join("");

main.js

// @ts-check
const mashString = require("./mashString");
console.log(mashString("12345"));

Buradaki ilişki: mashString.d.tsbir arabirimi tanımlar, arabirimi mashString.jsuygular ve arabirimi main.jskullanır.

Tür denetiminin çalışmasını // @ts-check sağlamak için .jsdosyalarınıza eklersiniz . Ancak bu yalnızca main.jsarabirimin doğru şekilde kullanıldığını denetler . Bunun mashString.jsdoğru bir şekilde uygulanmasını sağlamak /** @type {import("./mashString")} */için dışa aktarmadan önce ekliyoruz .

İlk .d.tsdosyalarınızı kullanarak oluşturabilir ve tsc -allowJs main.js -ddaha sonra tür kontrolünü ve dokümantasyonunu iyileştirmek için manuel olarak gerektiği gibi düzenleyebilirsiniz.

Çoğu durumda, uygulama ve arayüz burada aynı ada sahiptir mashString. Ancak alternatif uygulamalarınız olabilir. Mesela biz adlandırmak olabilir mashString.jsiçin reverse.jsve bir alternatif var encryptString.js.

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.