目录对值级别编程类型级别编程区分类型级编程挑战是如何工作的挑战对值级别编程类型级别编程区分 首先,让我们对值级别编程和类型级别编程进行重要区分。 值级别编程让我们编写将在生产中运行
首先,让我们对值级别编程和类型级别编程进行重要区分。
javascript没有类型,所以所有JavaScript都是值级别的代码:
// A simple Javascript function:
function sum(a, b) {
return a + b;
}
typescript允许我们将类型注释添加到JavaScript中,并确保我们编写的sum函数永远不会用数字以外的任何东西调用:
// Using type annotations:
function sum(a: number, b: number): number {
return a + b;
}
但TypeScript的类型系统远比这强大得多。我们编写的真实代码有时需要是通用的,并接受我们事先不知道的类型。
在这种情况下,我们可以在尖括号<A,B,…>中定义类型参数然后,我们可以将类型参数传递给一个类型级函数,该函数根据输入类型计算输出类型:
// Using type level programming:
function genericFunction<A, B>(a: A, b: B): DoSomething<A, B> {
return doSomething(a, b);
}
这就是类型级编程!DoSomething<A,B>
是一种用特殊编程语言编写的类型级函数,它与我们用于值的语言不同,但同样强大。让我们将这种语言称为类型级TypeScript。
// This is a type-level function:
type DoSomething<A, B> = ...
// This is a value-level function:
const doSomething = (a, b) => ...
类型级TypeScript是一种最小的纯函数语言。
在类型级别,函数被称为泛型类型:它们接受一个或多个类型参数并返回单个输出类型。下面是一个函数的简单示例,该函数使用两个类型参数并将它们包装在元组中:
type SomeFunction<A, B> = [A, B];
类型级别的TypeScript没有很多功能。毕竟,它是专门为你的代码做类型约束的!也就是说,它确实有足够的特性(几乎)图灵完备,这意味着你可以用它解决任意复杂的问题。
这是我们将在接下来的章节中学习的语言类型的简要概述。现在,让我们开始第一次挑战吧!
在每一章结束时,你将有一些挑战需要解决,以将你的新技能付诸实践。它们看起来像这样:
namespace challenge {
// 1. implement a generic to get the uNIOn
// of all keys in an object type.
type GetAllKeys<Obj> = TODO;
type res1 = GetAllKeys<{ a: number }>;
type test1 = Expect<Equal<res1, "a">>;
}
namespace
是一个鲜为人知的TypeScript功能,它可以让我们在专用范围内隔离每个挑战。TODO
是占位符。这是您需要更换的!res1=。。。
是泛型为某些输入类型返回的类型。您可以用鼠标将其悬停以检查其当前type test1=Expect<Equal<res1,…>>
是类型级单元测试。用于判断TODO
部分的代码是否正确在此之前你要先定义好Expect和Equal
type Expect<T extends true> = T;
type Equal<X, Y> = (<T>() => T extends { [k in keyof X]: X[k]; } ? 1 : 2) extends <T>() => T extends { [k in keyof Y]: Y[k]; } ? 1 : 2 ? true : false;
准备好迎接你的第一个挑战了吗?出发:
namespace genericFunction {
function identity(a: TODO): TODO {
return a;
}
let input1 = 10;
let res1 = identity(input1);
type test1 = Expect<Equal<typeof res1, number>>;
let input2 = "Hello";
let res2 = identity(input2);
type test2 = Expect<Equal<typeof res2, string>>;
}
namespace safeHead {
function safeHead(array: TODO[], defaultValue: TODO): TODO {
return array[0] ?? defaultValue;
}
let input1 = [1, 2, 3];
let res1 = safeHead(input1, 0);
type test1 = Expect<Equal<typeof res1, number>>;
let input2 = ["Hello", "Hola", "Bonjour"];
let res2 = safeHead(input2, "Hi");
type test2 = Expect<Equal<typeof res2, string>>;
}
namespace map {
function map(array: TODO[], fn: (value: TODO) => TODO): TODO[] {
return array.map(fn);
}
let input1 = [1, 2, 3];
let res1 = map(input1, value => value.toString());
type test1 = Expect<Equal<typeof res1, string[]>>;
let input2 = ["Hello", "Hola", "Bonjour"];
let res2 = map(input2, str => str.length);
type test2 = Expect<Equal<typeof res2, number[]>>;
}
namespace pipe2 {
function pipe2(
x: TODO,
f1: (value: TODO) => TODO,
f2: (value: TODO) => TODO
): TODO {
return f2(f1(x));
}
let res1 = pipe2(
[1, 2, 3],
arr => arr.length,
length => `length: ${length}`
);
type test1 = Expect<Equal<typeof res1, string>>;
let res2 = pipe2(
{ name: 'Alice' },
user => user.name,
name => name.length > 5
);
type test2 = Expect<Equal<typeof res2, boolean>>;
}
以上就是TypeScript类型级别和值级别示例详解的详细内容,更多关于TypeScript类型级别值级别的资料请关注编程网其它相关文章!
--结束END--
本文标题: TypeScript类型级别和值级别示例详解
本文链接: https://lsjlt.com/news/197642.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0