- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,假设我有一个像这样的(愚蠢的)函数:
function doSomething(input: number|string): boolean {
if (input === 42 || input === '42') {
trả về giá trị đúng;
} khác {
trả về false;
}
}
为什么我可以调用 array.some()
Giống như thế này:
function doSomethingWithArray(input: number[]|string[]): boolean {
return input.some(i => doSomething(i));
}
但不是array.every()
Giống như thế này:
function doEverythingWithArray(input: number[]|string[]): boolean {
return input.every(i => doSomething(i));
}
这给了我这个错误:
This expression is not callable.Each member of the union type '{ (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } | { ...; }' has signatures, but none of those signatures are compatible with each other.
我不明白其中的区别。在我看来,两者都应该起作用,或者两者都不起作用。我错过了什么?
请注意 doSomething()
接受 number|string
作为它的论点,所以它应该与 number[]|array[]
的每个元素一起工作,就像它对 array.some()
所做的一样,不应该吗?
1 Câu trả lời
这本质上是 TypeScript 的当前限制;见microsoft/TypeScript#44373 .
TypeScript 长期以来一直无法在 union 上调用方法数组类型。最初您根本无法调用函数联合,因为编译器不知道如何将多个签名合并为一个可用的签名。参见 microsoft/TypeScript#7294 :
// Before TS3.3:
declare const arr: string[] | number[];
arr.some(() => true); // error
arr.map(() => 1); // error
arr.every(() => true); // error
引入 TypeScript 3.3 some support用 microsoft/TypeScript#29011 做到这一点, 通过接受 intersection来自联合成员的参数。
但是这种支持只是针对相对简单的情况添加的,其中最多一个工会成员是 generic函数,最多一个工会成员是overloaded功能。因此,如果您要合并的数组方法是通用的或重载的,您仍然无法调用它们。所以有一个改进,但一些方法如 bản đồ()
仍然不可调用。参见 microsoft/TypeScript#36390 :
// TS3.3
declare const arr: string[] | number[];
arr.some(() => true); // okay
arr.map(() => 1); // error
arr.every(() => true); // okay
在某些时候,决定向 every()
添加一个通用重载,以便它可以充当 type guard function。 ;见microsoft/TypeScript#38200 .这很有用,但不幸的是,这意味着 every()
也停止处理数组类型的联合。这是随 TypeScript 4.0 一起发布的:
// TS 4.0
declare const arr: string[] | number[];
arr.some(() => true); // okay
arr.map(() => 1); // error
arr.every(() => true); // error
对于 TypeScript 4.2 microsoft/TypeScript#31023被合并,这增加了对泛型调用签名的调用联合的一些支持,只要泛型类型参数是相同的。但是对于重载的调用签名,问题仍然存在:
// TS 4.2+
declare const arr: string[] | number[];
arr.some(() => true); // okay
arr.map(() => 1); // okay
arr.every(() => true); // error
这就是我们目前所处的位置。
也许在某个时候,microsoft/TypeScript#44373 会得到解决。一般情况下,对于重载方法的联合,正确的做法是什么并不明显。我认为有人可能希望通过自动扩大到只读联合数组来仅针对联合数组的情况,因为手动执行此操作是我通常建议的解决方法,而且它相当安全:
const arr2: readonly (string | number)[] = arr; // okay
arr2.every(() => true); // okay
但目前,这还没有发生。
关于arrays - 为什么我可以调用 array.some() 而不是 array.every() 联合数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74390223/
Trong C: int a[10]; printf("%p\n", a); printf("%p\n", &a[0]); Đầu ra: 0x7fff5606c600 0x7fff5606c600 là những gì tôi mong đợi
Tôi đã thử chạy vòng lặp này để thay đổi vị trí của một phần tử dựa trên một mảng nhưng tôi nhận được lỗi sau. Không chắc chắn lắm về chuyện gì đã xảy ra. Có suy nghĩ hay ý tưởng nào không! Cảm ơn. dân số var = [[98, 8, 45, 34, 56], [9, 1
Tôi đang cố gắng lấy một mảng các mảng Ruby và nhóm chúng lại để tính toán giá trị của chúng. Một mảng có một tháng và một giá trị bool: array = [["Tháng sáu", false], ["Tháng sáu", false], ["Tháng sáu"
Vì vậy, mục tiêu của chúng ta là chia mảng thành các mảng con khi gặp một phần tử nhất định. Ví dụ sau array.split("stop here") ["haii", "keep", "these in the same array bu
Câu hỏi này trả lời rằng cả hai biểu thức đều như nhau, nhưng trong trường hợp này chúng cho ra kết quả khác nhau. Đối với một số điểm int[] nhất định, tại sao lại như thế này: Arrays.stream(scores).forEac
Tôi nghĩ thứ tôi cần là một mảng các giá trị băm, nhưng tôi không biết cách tạo ra nó. Perl có thể làm được điều đó không? Nếu vậy, mã sẽ trông như thế nào? Câu trả lời hay nhất perldoc perldsc là một tài liệu tốt để hiểu về cấu trúc dữ liệu Perl. Về Arra
Tôi gặp vấn đề này, từ API, tôi nhận được một JSON mở rộng chứa một đối tượng có tên là tọa độ, vốn là một mảng chứa nhiều mảng. Để xem ví dụ này rõ hơn: "coordinates": [
Trong postgres có (v 9.5, nếu quan trọng): tạo bảng json_test( id varchar NOT NULL, data jsonb NOT NULL, PRIM
Tôi đã sử dụng echo "${array[@]}" và echo "${array[*]}" và nhận được kết quả tương tự. Nếu tôi làm thế này: mkdir fakemusic; touch fakemusic/{Beatles,Sto
Tôi đang cố gắng tạo một mảng các mảng đối tượng typealias - nhưng tôi nhận được lỗi biên dịch "Kiểu biểu thức không rõ ràng khi không có thêm ngữ cảnh". Đây là mã của tôi: typealias TestClosure = ((message: St
Nếu bạn tạo mảng 1 chiều trong Python, thì việc sử dụng gói NumPy có lợi ích gì không? Câu trả lời hay nhất Điều này hoàn toàn phụ thuộc vào mục đích bạn định sử dụng mảng. Nếu tất cả những gì bạn làm là tạo các mảng có kiểu dữ liệu đơn giản và thực hiện I/O thì mô-đun mảng là phù hợp. Khác
Tại sao tôi lại nhận được cấu trúc dữ liệu này khi tôi đẩy một mảng vào một mảng các mảng chỉ có một mảng là phần tử duy nhất? sử dụng v6; @d của tôi = ( [ 1 .. 3 ] ); @d.push( [ 4 .. 6 ] ); @d.
Trong Julia, tôi muốn chuyển đổi dữ liệu được định nghĩa là mảng vectơ 2D thành mảng ma trận 2D. Như mô tả trong ví dụ sau, tôi muốn chuyển đổi dữ liệu s thành dữ liệu t nhưng cho đến nay vẫn chưa thành công. Tôi nên xử lý trường hợp này thế nào? julia> s = [[1 2 3], [4
C không có từ khóa elementsof để lấy số lượng phần tử trong một mảng. Vì vậy, điều này thường được thay thế bằng cách tính sizeof(Array)/sizeof(Array[0]) nhưng điều này đòi hỏi phải lặp lại tên biến mảng. 1[&Array] là con trỏ đến phần tử đầu tiên
Vì vậy, giả sử tôi có một hàm (ngớ ngẩn) như thế này: function doSomething(input: number|string): boolean { if (input === 42 || in
Tôi có mảng sau: a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] và tôi sử dụng nó cho một số thứ trực quan như thế này: 1 2 3 4 5 6 7 8 9 10
Tôi muốn biết sự khác biệt giữa .toList và .to[List] trong một mảng là gì. Tôi đã thực hiện thử nghiệm này trong spark-shell và không có sự khác biệt nào trong kết quả, nhưng tôi không biết nên sử dụng phương pháp nào tốt hơn. Có lời khuyên nào không? scala> val l = Arr
Tôi đang gặp sự cố khi lấy chỉ mục phần tử hiện tại cho nhiều phần tử của cùng một đối tượng: $b = "A","D","B","D","C","E","D","F" $b | ? { $_ -chứa "D" } Phiên bản thay thế: $b =
Tôi đang cố gắng thực hiện các tùy chọn với v-select đến từ API của mình, tôi có dữ liệu trong một mảng các mảng. Mảng mà tôi lấy từ API Nó phải là một lựa chọn với tìm kiếm vì nó
Câu hỏi này đã có câu trả lời tại đây: Chuỗi ký tự: con trỏ so với mảng char (1 câu trả lời) Đã đóng 4 tháng trước. Khi tôi thực thi mã tiếp theo int main() {
Tôi là một lập trình viên xuất sắc, rất giỏi!