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

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

SingleNegationElimination 3月前

239 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)
  • TS 支持这些,以允许如上所述的“品牌原语”

  • 我在转换 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',
                            ~~~~~~~~~~~~~~~~~~~~~~~~
    
  • Number (以大写字母开头)是一种特殊的内置类型。只有在极少数情况下才需要。对于你的情况,你需要使用小写类型 number 。请参阅 TypeScript 文档 .

  • 您遇到的错误是由于 DecimalPipe(或数字管道)需要字符串、数字、null 或未定义类型的值,但您的 RoomList 接口对评级字段使用 Number 类型而不是数字。

    TS 中的“Number”类型是包装器对象,而不是原始数字类型。DecimalPipe 无法处理此包装器类型,因此出现错误。

    为了解决这个问题,您可以将 RoomList 界面中的“评级”类型从 Number 更改为 number。尝试以下操作:

    export interface RoomList {
    roomNumber: number;
    roomType: string;
    amenities: string;
    price: number;
    photos: string;
    checkinTime: Date;
    checkoutTime: Date;
    rating: number; // Change this line
    }
    
  • 非常感谢@Kevin。我明白了

  • 我有一个 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 对我来说似乎不是一个好主意。还有其他更好的解决方案吗?

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

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

    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() 或我必须使用的其他方法?

  • rzwitserloot 是正确的,您应该为此使用 LinkedHashSet。

  • 正如其他人所证实的,它似乎 result.get() 总是意味着阻塞:我的期望是,如果使用 map_async 而不是 map 方法 result.get ,则会返回部分结果而不会阻塞。需要的是 imap imap_unordered 成功提供在调用时完成的结果列表,而不是等到一切准备就绪。

  • 您对 imap 和 imap_unordered 的描述有点不准确。这两个方法都返回一个迭代器(它不会“提供列表”),并且调用它的下一个方法(显式或隐式地使用 for result_value in ...)会在下一个结果可用时返回从工作函数返回的结果,或者在所有结果都已迭代时引发 StopIteration 异常。

  • 使用 addIfAbsent() 方法:

    CopyOnWriteArrayList<String> fruits = new CopyOnWriteArrayList<>();
    
    public boolean add(String fruit) {
        fruits.addIfAbsent(fruit);
    }
    
  • 谢谢,我正在寻找 List 接口,所以我错过了这个方法。无论如何,非常感谢 @shmosel :-)

  • 我试图将项目从 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,但无法修复错误

  • 引用 15

    尝试删除 .angular 文件夹、node_modules 和 package-lock.json,然后进行安装并启动

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

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

  • 我有大约 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 v18 兼容的 Typescript 版本?(最新 5.4.x?)

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

    还有 介绍 .

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

返回
作者最近主题: