8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么当将对象类型与字符串相交时,TypeScript 不会显示“从不输入”错误?

SingleNegationElimination 3月前

241 0

我试图理解为什么当对象类型与字符串类型相交时,TypeScript 没有在错误消息中明确显示 never 类型。这是我的代码:type Test1 = { b: numb...

我试图理解为什么当对象类型与字符串类型相交时,TypeScript 没有在错误消息中明确显示 never 类型。这是我的代码:

type Test1 = {
    b: number;
    c: string;
} & string;

// Type '{ b: number; c: string; }' is not assignable to type 'Test1'.
// Type '{ b: number; c: string; }' is not assignable to type 'string'.
let test1: Test1 = {
    b: 1,
    c: 'c',
}

// Type 'string' is not assignable to type 'Test1'.
// Type 'string' is not assignable to type '{ b: number; c: string; }'.
let test1: Test1 = 'test1'

在上面的代码中,Test1 被定义为对象类型和字符串的交集。根据我的理解,这应该导致 never 类型,因为没有值可以同时是具有属性的对象 b c 字符串。

  1. 当尝试将一个对象分配给 test1 时,我得到:
Type '{ b: number; c: string; }' is not assignable to type 'Test1'.
Type '{ b: number; c: string; }' is not assignable to type 'string'.
  1. 当尝试将字符串分配给 test1 时,我得到:
Type 'string' is not assignable to type 'Test1'.
Type 'string' is not assignable to type '{ b: number; c: string; }'.

据我了解,这些应该表明 Test1 实际上是 never 类型,但 TypeScript 似乎没有在错误消息中提到 never。这是 TypeScript 中的错误,还是我在 TypeScript 处理此类交集的方式上遗漏了什么?

如能就此行为做出任何澄清,我们将不胜感激。谢谢!

帖子版权声明 1、本帖标题:为什么当将对象类型与字符串相交时,TypeScript 不会显示“从不输入”错误?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由SingleNegationElimination在本站《typescript》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 服务器代码的执行到达 accept() 函数,然后 GUI 线程取得控制权,acceptSocket 的结构对我来说非常重要,因为通过调用 SendMessage() 函数……

    服务器代码的执行到达 accept() 函数,并且 GUI 线程获得控制权,acceptSocket 的结构对我来说非常重要,因为通过调用 SendMessage() 程序会终止。WSAGetLastError() 返回错误 #10038。我该怎么办?

    void Tcp_server::init(int amount_of_connections){
        int wsaerr;
        std::mutex mut;
        WORD wVersionRequired = MAKEWORD(2, 2);
        wsaerr = WSAStartup(wVersionRequired, &wsaData);
        try {
            if (wsaerr != 0) {
                throw WSAGetLastError();
            }
            std::cout << "The winsock dll is found!" << std::endl;
            std::cout << "The status: " << wsaData.szSystemStatus << std::endl;
        }
        catch (...) {
            std::cout << WSAGetLastError() << std::endl;
        }
    
        try {
            serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (serverSocket == INVALID_SOCKET) {
                throw WSAGetLastError();
            }
            std::cout << "socket() is OK!" << std::endl;
        }
        catch (...) {
            std::cout << "socket() failed, Error #" << WSAGetLastError() << std::endl;
            closesocket(serverSocket);
            WSACleanup();
        }
    
        std::string m_address = "192.168.0.103";
    
        service.sin_family = AF_INET;
        inet_pton(AF_INET, m_address.c_str(), &service.sin_addr.s_addr);
        service.sin_port = htons(8080);
        try {
            if (bind(serverSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
            {
                throw WSAGetLastError();
            }
            std::cout << "bind() is OK!" << std::endl;
        }
        catch (...) {
            std::cout << "bind() failed, Error #" << WSAGetLastError() << std::endl;
            closesocket(serverSocket);
            WSACleanup();
        }
        const std::lock_guard<std::mutex>l(mut);
        if (listen(serverSocket, amount_of_connections) == SOCKET_ERROR) {
            std::cout << "Listening error# " << WSAGetLastError() << std::endl;
        }
    
        else {
            std::cout << "listen() is OK, waiting for connections..." << std::endl;
        }
        acceptSocket = accept(serverSocket,NULL,NULL);
        if (acceptSocket == INVALID_SOCKET) {
            std::cout << "accept() failed, ERROR# " << WSAGetLastError() << std::endl;
            WSACleanup();
            exit(-1);
        }
    }
    

    主窗口.cpp:

    #include "mainwindow.h"
    #include "./ui_mainwindow.h"
    #include "ServerClass.h"
    #include<thread>
    Tcp_server server(1);
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        std::thread session(server.init,server,1);
        session.join();
        ui->setupUi(this);
    
    
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_Connect_clicked()
    {
    
    }
    
    void MainWindow::on_Send_clicked()
    {
    
        QString mess_text = ui->Message->text();
        ui->textBrowser->append(mess_text);
    
        server.SendMessage(mess_text,server.getaccSocket());
        ui->Message->clear();
    
    }
    
    
    
    
    
    

    我尝试用 std::mutex 锁定 accept()。没有成功。我还尝试使用 join() 函数而不是 detach(),也没有成功。程序只是停止执行

  • 从 Joel Albahari 关于线程的在线资源中,他写道:在简单的场景中,模拟跨一组等待句柄工作的静态方法很容易。相当于调用

    从 Joel Albahari 关于 threading ,他说道:

    在简单情况下,模拟一组等待句柄上的静态方法很容易。相当于调用 WaitAll 的 只不过是一个阻塞条件,其中包含了用于代替等待句柄的所有标志:

    lock (_locker)
      while (!_flag1 && !_flag2 && !_flag3...)
        Monitor.Wait (_locker);
    

    我真的不明白我们如何才能以 WaitH和le.WaitAll Monitor.Wait Monitor.Pulse 相同的方式 AutoResetEvent and ManualResetEvent 例如实现的 ManualResetEventSlim 方式

    有人有可行的示例实现吗?

  • 我有大约 75000 个文件,我需要在每个文件中搜索存储在数组中的一组关键短语。我有能够运行 20 个线程的 Intel i9。我正试图通过 slur 来加快整个过程...

    我有大约 75000 个文件,我需要在每个文件中搜索存储在数组中的一组关键短语。我有能够运行 20 个线程的 Intel i9。我试图通过将每个文件分解成字符串并同时匹配每个关键短语来加快整个过程。我想知道如何使用 hyper/race 来进一步加快这个过程。或者 junction 会自动并发地在线程之间分配任务吗?

    [1] > my $a = (1..10).join
    12345678910
    [3] > my @b = (3, /5./, /8\d/)
    [3 /5./ /8\d/]
    [4] > say $a.match( @b.all )
    all(3, 56, 89)
    
    [4] > say hyper $a.match( @b.all )
    No such method 'hyper' for invocant of type 'Match'.    # what to do?
    
  • 我试图将项目从 Angular 14 更新到 18。当然,我是逐步从 14 更新到 15。然后从 15 更新到 16,再从 16 更新到 17,目前从 17 更新到 18。当从 16 更新到 17 时,我……

    我正在尝试将项目从 Angular 14 更新到 18。

    当然,我是在 14 岁到 15 岁之间逐渐练习的,然后从 15 岁到 16 岁,再从 16 岁到 17 岁,现在从 17 岁到 18 岁。

    从 16 更新到 17 时出现此错误

    Error: node_modules/@ngrx/effects/src/effect_creator.d.ts:42:101 - error TS2313: Type parameter 'OT' has a circular constraint.
    
    42 export declare function createEffect<C extends EffectConfig, DT extends DispatchType<C>, OT extends ObservableType<DT, OT>, R extends EffectResult<OT>>(source: () => R & ConditionallyDisallowActionCr
    eator<DT, R>, config?: Partial<C>): R & CreateEffectMetadata;
    

    经搜索,发现需要安装Typescript 5.3.3版本才能修复此错误。

    我修复了 Angular 17 版中的这个错误,一切正常

    切换到 Angular 18 时,错误重复出现

    但是 Angular 18 有一个问题,你需要有一个 Typescript 版本 >=5.4.0 <5.5.0。

    如果有人能帮助我,我会很高兴,提前谢谢

    我尝试安装不同版本的 Typescript,但无法修复错误

  • 我有一个多处理线程池,主线程上运行着一个循环。主循环必须在不被阻塞的情况下运行:它在启动时向线程池发出任务,并且只要所有结果都已

    我有一个多处理线程池,主线程上运行着一个循环。主循环必须在不被阻塞的情况下运行:它在启动时向线程池发出任务,并且每当处理完所有结果并计算出一组新结果时,它都会计算出一组新结果,同时检索那些可用的结果,即使池仍然很忙。

    import multiprocessing as mp
    
    def double(x):
       return x * 2
    
    pool = mp.Pool()
    items = [1, 2, 3, 4]
    result = None
    
    while True:
        if result:
            for value in result.get():
                print(value)
        if not result or result.ready():
            result = pool.map_async(double, items)
        print("This should still execute even when results aren't ready!")
    

    尽管所有文档都同意 map_async 应该是非阻塞的,但整个 while True 循环都会等待,直到它们准备就绪。这似乎是由触发的, result.get() 但如果使用,即使这样也不应该阻塞主循环, map_async 因此有一种 result.ready() 方法可以检查整个任务是否已完成。是否有非阻塞版本 result.get() 或我必须使用的其他方法?

  • 我有一个 CopyOnWriteArrayList,因为我的代码应该是线程安全的。List friuts = new CopyOnWriteArrayList<>();我不想在列表中有重复的 friuts,我不能使用 Set,因为我想要

    我有一个 CopyOnWriteArrayList 因为我的代码应该是线程安全的。List friuts = new CopyOnWriteArrayList<>();

    我不想在列表中有重复的水果,我不能使用 Set,因为我也想有插入顺序。我写了这段代码

    public boolean add(String friut) {
        synchronized (friuts) {
            if (friuts.contains(friut)) {
                return false;
            }
            friuts.add(friut);
        }
        return true;
    }
    

    据我所知,CopyOnWriteArrayList 已经是并发的了。因此,在同步块中添加 CopyOnWriteArrayList.add 对我来说似乎不是一个好主意。还有其他更好的解决方案吗?

  • 我在转换 numberMy 代码时收到 DecimalPipe 错误:Serviceexport interface RoomList { roomNumber: number; roomType: string; amenities: string; price: number; pho...

    我在转换数字时收到 DecimalPipe 错误

    我的代码: 服务

    export interface RoomList {
        roomNumber: number;
        roomType: string;
        amenities: string;
        price: number;
        photos: string;
        checkinTime: Date;
        checkoutTime: Date;
        rating: Number;
    }
    

    成分

    import { Component } from '@angular/core';
    import { Room, RoomList } from './rooms';
    import { CurrencyPipe, DatePipe, DecimalPipe, LowerCasePipe, NgClass, NgFor, NgIf, NgStyle } from '@angular/common';
    
    @Component({
      selector: 'app-rooms',
      standalone: true,
      imports: [NgIf, NgFor, NgClass, NgStyle, DatePipe, CurrencyPipe, LowerCasePipe, DecimalPipe],
      templateUrl: './rooms.component.html',
      styleUrl: './rooms.component.scss'
    })
    export class RoomsComponent {
      hotelName = "Hilton Hotel";
      numberOfRoom = 10;
      hideRoom = false;
      rooms: Room = {
        availableRooms: 10,
        bookedRooms: 5,
        totalRooms: 20
      };
    
      roomList: RoomList[] = [
        {
          roomNumber: 1,
          roomType: 'Heloe',
          amenities: "HN",
          price: 5000,
          photos: './image2',
          checkinTime: new Date('11-Nov-2021'),
          checkoutTime: new Date('12-Nov-2021'),
          rating: 4.555
        },
        {
          roomNumber: 2,
          roomType: 'Donh',
          amenities: "NB",
          price: 10000,
          photos: './image2',
          checkinTime: new Date('17-Sep-2021'),
          checkoutTime: new Date('20-Sep-2021'),
          rating: 3.516
        },
        {
          roomNumber: 3,
          roomType: 'Holds',
          amenities: "DN",
          price: 200,
          photos: './image3',
          checkinTime: new Date('17-Sep-2021'),
          checkoutTime: new Date('20-Sep-2021'),
          rating: 3.99999
        },
        {
          roomNumber: 4,
          roomType: 'Bed',
          amenities: "CT",
          price: 1000,
          photos: './image4',
          checkinTime: new Date('11-Mar-2024'),
          checkoutTime: new Date('20-July-2024'),
          rating: 4.999
        }
      ];
    
    
      fnName() {
    
      }
      toggle() {
        this.hideRoom = !this.hideRoom;
      }
    }
    

    html

    <div *ngIf="rooms.availableRooms > 0">
        Rooms List
        <!-- {{roomList}} -->
        <table>
            <tr>
                <th>Order</th>
                <th>Room Number</th>
                <th>Room Type</th>
                <th>Room Amenity</th>
                <th>Room Price</th>
                <th>Checkin Time</th>
                <th>Checkout Time</th>
                <th>Rating</th>
            </tr>
            <tr *ngFor="let room of roomList; let i=index;" [ngClass]="i%2 ? 'even' : 'odd'">
                <td>{{i}}</td>
                <td>{{room.roomNumber}}</td>
                <td>{{room.roomType}}</td>
                <td>{{room.amenities | lowercase}}</td>
                <td>{{room.price | currency : 'INR'}}</td>
                <td>{{room.checkinTime | date:'short'}}</td>
                <td>{{room.checkoutTime | date: 'short'}}</td>
                <td>{{room.rating | number}}</td>
            </tr>
        </table>
    </div>
    

    我尝试使用下面这种格式

    <td>{{room.rating | number: '1.1-2'}}</td>
    

    但出现了类似这样的错误

    X [ERROR] NG9: No overload matches this call.
      Overload 1 of 3, '(value: string | number, digitsInfo?: string | undefined, locale?: string | undefined): string | null', gave the following error.
        Argument of type 'Number' is not assignable to parameter of type 'string | number'.
      Overload 2 of 3, '(value: null | undefined, digitsInfo?: string | undefined, locale?: string | undefined): null', gave the following error.
        Argument of type 'Number' is not assignable to parameter of type 'null | undefined'.
      Overload 3 of 3, '(value: string | number | null | undefined, digitsInfo?: string | undefined, locale?: string | undefined): string | null', gave the following error.
        Argument of type 'Number' is not assignable to parameter of type 'string | number | null | undefined'. [plugin angular-compiler]
    
        src/app/rooms/rooms.component.html:30:23:
          30              <td>{{room.rating | number: '1.1-2'}}</td>
                                     ~~~~~~
    
      Error occurs in the template of component RoomsComponent.
    
        src/app/rooms/rooms.component.ts:9:15:
          9    templateUrl: './rooms.component.html',
                            ~~~~~~~~~~~~~~~~~~~~~~~~
    
  • 不,这是我的问题。我不知道如何让 accept() 函数完成工作

  • 在调试时,代码在 accept() 调用时停止响应,因此 acceptSocket == SOCKET_ERROR

  • 无论我在哪里加入会话线程,程序都会停止响应也许存在 accept() 函数的并发模拟?

  • 创建一个线程并立即加入它有点没意义。这样做没有并发性。就像“启动一个线程,它应该做一些与当前线程不同的事情”,然后立即“现在让当前线程等待它完成”

  • @Dai \'由于 COM 遗留问题,WaitAll 通常无法使用,因此此功能特别有用。\' \'不支持在 STA 线程上对多个句柄执行 WaitAll。\'... 理论上理解作者的观点

  • ...你为什么要重新实现

  • 非常感谢 Elizabeth Mattijsen。我会查看 rak。

  • 是的,我也这么做了

  • 也许 App::Rak 能帮你解决这个问题?或者可能是它的管道 rak

    还有 介绍 .

    回答您的问题“连接点是否会自动并发地跨线程分配任务?”。我们的想法是,在某一时刻它们可能会这样做,但这不是它们当前的实现方式。

  • 您是否尝试过更新到与 Angular v18 兼容的 Typescript 版本?(最新 5.4.x?)

  • 你可以尝试安装最新版本的 ngrx,或者尝试降级 typescript

  • 在我写这里之前,我已经尝试了所有方法,但还是无法解决问题

返回
作者最近主题: