Senin bilmediğin bir şey biliyorum: kontrol türleri



  1. Senin bilmediğin bir şey biliyorum: kontrol türleri

Özellikle dile yeni başlayanlar, JavaScript geliştirirken şu veya bu tür hatayla karşılaşabilir. JavaScript’te tip kontrolleri neden bir şeydir – arasındaki fark neydi? biraz– ve örneği-Şebeke? Ve arasındaki fark nedir? sıfır Ve Tanımsız? çünkü o o birazOperatör, diziler ve normal ifadeler için “nesne”, ancak işlevler için “işlev” döndürür mü (bunlar aslında nesne olsalar da)?


“Senin Bilmediğin Bir Şeyi Biliyorum”


…Golo Roden ve Philip Ackermann’ın ortak serisidir ve bu seride ikisi düzenli olarak JavaScript ve Node.js için modüller sunar.





Genel olarak çalışır biraz-Oldukça güvenilmez operatör veya daha doğrusu: bir geliştiriciden bekleyebileceğiniz şekilde değil. Aşağıdaki listedeki örnekler bunu göstermektedir: bireysel ilkel veri türleri ve işlevleri ile özel değer arasındaki fark dışında Tanımsız işleç her zaman “nesne” değerini döndürür (hatta sıfırki bu tarihseldir ve ECMAScript belirtiminde hiç değiştirilmemiştir).

console.log(typeof {}); // object
console.log(typeof function () {}); // function
console.log(typeof []); // object
console.log(typeof 2); // number
console.log(typeof ''); // string
console.log(typeof true); // boolean
console.log(typeof new Date()); // object
console.log(typeof /tests/i); // object
console.log(typeof null); // object
console.log(typeof undefined); // undefined

Her durumda ne tür bir nesne olduğunu daha kesin olarak bulmak için daha fazla test yapılması gerekir. örneğin örneğioperatörü veya aşağıdaki örnekte gösterildiği gibi, bir yöntem çağrısının Hibe etmek() dahili mülkiyet üzerinde [[Class]] değerine erişir ve değerini okur:

Object.prototype.toString.call(value);

Tüm bunlar, daha sonra bir yardımcı işleve sarıldığında, daha kullanışlı sonuçlar sunar:

function getType(value) {
return Object.prototype.toString.call(value);
}
console.log(getType({})); // [object Object]
console.log(getType(function () {})); // [object Function]
console.log(getType([])); // [object Array]
console.log(getType(2)); // [object Number]
console.log(getType('')); // [object String]
console.log(getType(true)); // [object Boolean]
console.log(getType(new Date())); // [object Date]
console.log(getType(/tests/i)); // [object RegExp]
console.log(getType(null)); // [object Null]
console.log(getType()); // [object Undefined]


Ancak hepsi bu kadar değil: Dikkate alınması gereken başka engeller ve özel durumlar da var. Kısacası, JavaScript’te tür denetimi oldukça sıkıcı olabilir. Tüm bunları sizin için yapan bir Node.js modülü olup olmadığı sorusu ortaya çıkıyor. Cevap evet, var.


Kontrol türleri modülü


Ayrıca birkaç modül vardır, ancak kontrol türleri modülü en aktif olarak geliştirilenlerden biridir. kontrol türleri, komut kullanılarak yerel bir bağımlılık olarak npm aracılığıyla kurulabilir npm, kontrol türlerini yükler veya küresel olarak npm install -g kontrol türleri. Sonra her zamanki gibi kullanılabilir rica etmek() içermek:

let t = require('check-types');

(Alternatif olarak, kontrol tipleri ayrıca tarayıcıya entegre etmek için etiketi. Bu durumda, modül global nesneyi sağlar. Kontrol elden çıkarmak için).

Önceki listelerde listelenen türler için, kontrol türleri (normal ifadeler hariç), iletilen değerin uygun türde olup olmadığını kontrol eden aynı adlı bir yöntem sağlar:

console.log(t.object({})); // true
console.log(t.function(function () {})); // true
console.log(t.array([])); // true
console.log(t.number(2)); // true
console.log(t.string('')); // true
console.log(t.boolean(true)); // true
console.log(t.date(new Date())); // true
console.log(t.null(null)); // true
console.log(t.undefined()); // true

Genel olarak, modül API’sinin tamamı okunabilir kod üretmeye yöneliktir. Örneğin, bir aramayı reddetmek için etkinleştirmeniz yeterlidir. olumsuzluk arasında:

console.log(t.not.object({})); // false
console.log(t.not.function(function () {})); // false
console.log(t.not.array([])); // false
console.log(t.not.number(2)); // false
console.log(t.not.string('')); // false
console.log(t.not.boolean(true)); // false
console.log(t.not.date(new Date())); // false
console.log(t.not.null(null)); // false
console.log(t.not.undefined()); // false

Örneğin, aradığınızda buna izin vermek istiyorsanız, sayı() ayrıca geçmiş değer sıfır veya Tanımsız olabilir, bu araya giren bir aracılığıyla elde edilir olabilirdi:

console.log(t.number(null)); // false
console.log(t.maybe.number(null)); // true
console.log(t.number(undefined)); // false
console.log(t.maybe.number(undefined)); // true
console.log(t.maybe.number('')); // false

Bir değerin bir sınıfın nesne örneği (veya bir prototip) olup olmadığı, yöntem kullanılarak belirlenebilir. misal() tespit etmek:

'use strict';
let t = require('check-types');
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
let max = new Person('Max', 'Mustermann');
console.log(t.instance(max, Person)); // true

“Yazılan dizileri” de kontrol edebilirsiniz:

let numbers = [2,3,4,5];
console.log(t.array.of.number(numbers)); // true

Ek olarak, örneğin sayılarla çalışmak için birçok farklı türe özgü yöntem mevcuttur (daha büyük(), daha büyükOrEqual(), az(), eksiOrEqual(), arasında() vb.) veya karakter dizileri (boşDize(), içerir() Vesaire.).

Bahsedilen tüm yöntemler her zaman bir boole değeri döndürür: GERÇEKiletilen değer uygun türdeyse, aksi takdirde YANLIŞ. Ancak, ikinci durumda bir hata oluşmasını istiyorsanız, bunu araya bir a koyarak yapabilirsiniz. iddia etmek ulaşmak için:

t.assert.number(5); // Ok
t.assert.number('5'); // Wirft Fehler

Bu şekilde, döndürülen boole değerini kontrol etme ve kendiniz bir hata atma konusunda endişelenmenize gerek kalmaz. Çok uygun.

Kullanım durumu: parametre doğrulama


Kontrol türlerini kullanmak için bir kullanım durumu ne olabilir? Örneğin, ayarlayıcı yöntemleri içinde her durumda geçerli bir değerin iletildiğinden emin olmak için, yani parametreleri doğrulamak için (yani, TypeScript önişlemci dili ve Typechecker statik akışının da kendi yollarıyla kontrol ettiği şey). Örneğin, aşağıdaki liste ayarlayıcının ilk adı() Ve Soyadı() yalnızca karakter dizilerini kabul eder, 4711 değerinin belirtilmesi bir hata oluşturur:

'use strict';
let t = require('check-types');
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get firstName() {
return this._firstName;
}
set firstName(firstName) {
t.assert.string(firstName);
this._firstName = firstName;
}
get lastName() {
return this._lastName;
}
set lastName(lastName) {
t.assert.string(lastName);
this._lastName = lastName;
}
}
let max = new Person(4711, 'Mustermann'); // Error: Invalid string
Çözüm


JavaScript’te tür denetimi basit olmaktan uzaktır. Check-types modülü sizin için çok iş yapar, oldukça anlaşılır bir API sayesinde kullanımı nispeten kolaydır ve örneğin ayarlayıcı yöntemlerde parametrelerin doğrulanması için uygundur.


()



Haberin Sonu
 
Üst