Tìm kiếm trang web

Kiểm tra mảng loại chuỗi trong TypeScript


Làm thế nào tôi có thể kiểm tra nếu một biến là mảng các chuỗi trong TypeScript? Gì đó giống như thế này:

function f(): string {
    var a: string[] = ["A", "B", "C"];

    if (typeof a === "string[]")    {
        return "Yes"
    }
    else {
        // returns no as it's 'object'
        return "No"
    }
};

TypeScript.io ở đây: http://typescript.io/k0ZiJzso0Qg/2

Chỉnh sửa: Tôi đã cập nhật văn bản để yêu cầu kiểm tra cho string[]. Trước đây điều này chỉ có trong ví dụ mã.

Câu trả lời #1

Bạn không thể kiểm tra string[] trong trường hợp chung nhưng bạn có thể kiểm tra Array khá dễ dàng giống như trong JavaScript https://stackoverflow.com/a/767492/390330 (Tôi thích Array.isArray(value)).

Nếu bạn muốn dành riêng cho mảng string, bạn có thể làm điều gì đó như sau:

if (Array.isArray(value)) {
   var somethingIsNotString = false;
   value.forEach(function(item){
      if(typeof item !== 'string'){
         somethingIsNotString = true;
      }
   })
   if(!somethingIsNotString && value.length > 0){
      console.log('string[]!');
   }
}

Trong trường hợp bạn cần kiểm tra một mảng của một lớp (không phải kiểu cơ bản)

if(items && (items.length > 0) && (items[0] instanceof MyClassName))

Nếu bạn không chắc rằng tất cả các mục đều cùng loại

items.every(it => it instanceof MyClassName)

Câu trả lời #2

Một lựa chọn khác là Array.isArray()

if(! Array.isArray(classNames) ){
    classNames = [classNames]
}

Câu trả lời #3

Đây là giải pháp ngắn gọn nhất cho đến nay:

function isArrayOfStrings(value: unknown): value is string[] {
   return Array.isArray(value) && value.every(item => typeof item === "string");
}

Lưu ý rằng value.every trả về true cho một mảng rỗng. Để trả về false cho một mảng rỗng, thêm value.length > 0 vào điều kiện:

function isNonEmptyArrayOfStrings(value: unknown): value is string[] {
    return Array.isArray(value) && value.length > 0 && value.every(item => typeof item === "string");
}

Không có bất kỳ thông tin kiểu thời gian chạy nào trong TypeScript (và sẽ không có, xem Mục tiêu Thiết kế TypeScript > Mục tiêu không, 5), vì vậy không có cách nào để lấy "kiểu" của các phần tử trong một mảng rỗng. Đối với mảng không rỗng, tất cả những gì bạn có thể làm là kiểm tra kiểu của các mục trong đó, từng phần tử một.

Kiểu predicate value is string[] thu hẹp kiểu của value thành string[] trong phạm vi tương ứng. Đây là một tính năng của TypeScript, kiểu trả về thực sự của hàm là boolean.

Bài viết liên quan