带有鸭子类型对象的打字稿字符串文字

Posted

技术标签:

【中文标题】带有鸭子类型对象的打字稿字符串文字【英文标题】:Typescript string literal with duck-typed object 【发布时间】:2016-07-24 18:23:10 【问题描述】:

Typescript 1.8 引入了字符串字面量类型。但是,当将对象作为参数传入时,如下所示:

const test = 
    a: "hi",
    b: "hi",
    c: "hi"
;

interface ITest 
    a: "hi" | "bye"


function testFunc (t: ITest) 



testFunc(test);

它失败了:

类型参数 ' a: string; b:字符串; c:字符串; ' 不可分配给“ITest”类型的参数。 属性“a”的类型不兼容。 类型 'string' 不可分配给类型 '"hi" | “再见”'。 类型 'string' 不能分配给类型 '"bye"'。

我希望它能够工作,因为它符合界面的要求,但我可能忽略了一些东西。

【问题讨论】:

a、b 和 c 是测试中的字符串类型,“hi” |在您的界面中输入“再见”。 这是有道理的,尽管它有点违反直觉。谢谢。 【参考方案1】:

test.a 的类型已被推断为string 而不是"hi"。编译器正在比较类型而不是初始字符串表达式。

为了完成这项工作,您需要将该属性键入为"hi" | "bye"

type HiBye = "hi" | "bye";

const test = 
    a: "hi" as HiBye,
    b: "hi",
    c: "hi"
;

interface ITest 
    a: HiBye


function testFunc (t: ITest) 


testFunc(test);

请注意,在原始情况下,编译器将test.a 的类型推断为"hi" 是没有意义的,因为您可以在test.a 到达testFunc(test) 之前为其分配不同的值——例如. test.a = "not hi".

旁注: 编译器不会将类型推断为字符串表达式,即使是常量字符串变量也很好。这也会导致很多烦恼……想象一下:

const myVariableTypedAsHi = "hi";   // implicitly typed as "hi"
let otherVar = myVariableTypedAsHi; // otherVar implicitly typed as "hi"

otherVar = "test"; // error: cannot assign `"test"` to `"hi"`—well that would be annoying

【讨论】:

以上是关于带有鸭子类型对象的打字稿字符串文字的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中迭代字符串文字类型

打字稿转换 Object.entries 将派生字符串数组减少为文字类型

打字稿中对象文字的类型安全合并

带有多个属性的对象的打字稿排序数组

如何在打字稿中使用可能的字符串和数字索引确定对象的类型?

打字稿并将对象转换为字符串