gpt4 book ai didi

TypeScript 条件类型提示类型不可分配

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:33 25 4
gpt4 key购买 nike

我想了解 TypeScript 条件类型的工作原理。这是我的代码。存在类型错误:

interface MyType {
name: string;
}

const testFunc = <T extends MyType | string>(
what: T
): T extends MyType ? MyType : string => {
if (typeof what === 'object') {
return what['name'];
}
return what;
};

什么是正确的用法?

enter image description here

enter image description here

最佳答案

代码中的函数 TestFunc 应该在每种情况下都返回 string。我认为这是一种错字。让我们修复它并继续。

后来我想出了一个更安全的解决方案(我把我的旧答案留在底部)。最好使用重载。在重载中描述条件逻辑,在函数中使用联合类型。

interface MyType {
name: string;
}

function testFunc<T extends MyType | string>(
what: T
): T extends MyType ? string : MyType;

function testFunc(what: MyType | string): MyType | string {
if (typeof what === 'object') {
return what.name;
}
return { name: what };
}

旧答案:

interface MyType {
name: string;
}

type TestFunc = <T extends MyType | string>(what: T) => T extends MyType ? string : MyType;

const testFunc: TestFunc = (what: any) => {
if (typeof what === 'object') {
return what.name;
}
return { name: what };
};

或者如果您更喜欢定义内联类型:

interface MyType {
name: string;
}

const testFunc: <T extends MyType | string>(what: T) =>
T extends MyType ? string : MyType =
(what: any) => {
if (typeof what === 'object') {
return what.name;
}
return { name: what };
};

Typescript 编译器会这样处理:

const a1: MyType = testFunc({ name: 'foo' }); // Type 'string' is not assignable to type 'MyType'.

const a2: MyType = testFunc({ name: 1 }); // Error: Argument of type '{ name: number; }'
// is not assignable to parameter of type 'string | MyType'

const a3: string = testFunc({ name: 'foo' }); // Ok

const a4: string = testFunc('foo'); // Error: Type 'MyType' is not assignable to type 'string'.

const a5: MyType = testFunc('foo'); // Ok

关于TypeScript 条件类型提示类型不可分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55641731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com