【问题标题】:Typescript: Ensure all properties use the same tuple type打字稿:确保所有属性使用相同的元组类型
【发布时间】:2023-01-25 20:31:55
【问题描述】:

我有一个带有泛型的函数,它是 1 个元素的元组或 2 个元素的元组。
我想确保函数中使用的所有属性都使用相同长度的元组。

type TypeA = [string] // Tuple of 1 element
type TypeB = [string, string] // Tuple of 2 elements
type Header = TypeA | TypeB

interface SomeObject<H extends Header> {
    prop1: H
    prop2: H
}

function useHeader<H extends Header>(someObject:SomeObject<H>) {
    // do something
}

useHeader({
    prop1: ["tuple of 1 element"],
    prop2: [
        "tuple of", 
        "2 elements"
    ] // <-- I want an error here, because prop1 and prop2 use diffrent tuples
})

我注意到当我将 TypeA 更改为 number 并将 TypeB 更改为 string 时,当我混合数字和字符串时,Typescript 会报错。
当使用不同长度的元组时,是否可以使 Typescript 产生错误?

【问题讨论】:

    标签: typescript tuples typescript-generics type-safety


    【解决方案1】:

    考虑这种方法:

    type TypeA = [string] // Tuple of 1 element
    type TypeB = [string, string] // Tuple of 2 elements
    
    type Header = TypeA | TypeB
    
    interface SomeObject<H extends Header> {
        prop1: H
        prop2: H & {} // <------- CHANGE IS HERE
    }
    
    function useHeader<H extends Header>(someObject: SomeObject<H>) {
        // do something
    }
    
    useHeader({
        prop1: ["tuple of 1 element"],
        prop2: [
            "tuple of",
            "2 elements"
        ] // <-- I want an error here, because prop1 and prop2 use diffrent tuples
    })
    

    Playground

    这一行H &amp; {} 的意思是“降低推理优先级”。换句话说,TS 将首先为 prop1 推断出 H,然后才推断出第二个 prop2,而不是同时推断。

    这不是记录的功能。

    您可以在 my blog 中找到更多未记录的功能。 this answer 中提供了这个特殊的 hack

    【讨论】:

    • 太酷了,谢谢!知道为什么没有记录吗?它是实验性的吗?
    • 请一如既往地注意,未记录的“功能”可能会消失。
    猜你喜欢
    • 2018-12-16
    • 2020-06-19
    • 2022-08-18
    • 2019-08-15
    • 2018-03-27
    • 2019-03-12
    • 2022-01-17
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多